열 항목을 다른 열의 내용으로 조건부로 바꾸기

열 항목을 다른 열의 내용으로 조건부로 바꾸기

csv 파일에 금융 가격 데이터가 있는데 일반적인 줄은 다음과 같습니다.

2012-06-06 18:00:00,2012-06-06 19:00:00,4,2012-06-06 14:00:00,4,1644.8005,1644.8,1631.232,1632.266,7353,TRUE

이 특정 예에서는 열 6과 7이 모두 동일한 값을 포함하도록 조건에 따라 열 7의 내용을 열 6의 내용으로 바꾸려고 합니다.

이러한 조건부 작업이 완료되어야 하는 파일 라인 번호는 별도의 텍스트 파일(다른 프로그램 Octave의 출력인 "line_index_file"이라고 함)에서 읽습니다. 예를 들어 다음과 같습니다.

100
125

이는 위 작업이 원본 데이터 파일의 100행과 125행에만 적용될 수 있음을 의미합니다.

sed나 awk를 사용하여 이 작업을 어떻게 수행할 수 있나요?

답변1

이것을 시도해 볼 수 있습니다.

awk 'BEGIN{FS=OFS=","}NR==FNR{a[$0];next}FNR in a {$7=$6}1' line_index_file file.csv

답변2

이 시도

 for i in `cat line_index_file`
 do
     echo -e "`awk -v b=$i -F ',' 'BEGIN{OFS = ","} NR!=b{$7=$6};{print $0}' file.csv`" > file.csv
 done
  • NR!=b조건의 줄 번호 무시

답변3

sed편집기를 사용하여 이 작업을 수행할 수도 있습니다 .

cmds=$(< line_index_file xargs -l printf '\t%sba\n')

sed -e "
${cmds}
    ;# skip these
    b
    :a
    s/,/\n/5;s//\n/5;s//\n/5
    s/\n\(.*\)\n.*\n/,\1,\1,/
" input.csv

설명하다:

  • 먼저 분기에 언급된 행 cmds의 레이블 정보를 보유하는 쉘 변수를 작성하십시오.:aline_index_file
  • line_index_file에 언급되지 않은 다른 라인의 처리를 건너뜁니다.
  • 5번째, 6번째, 7번째 필드 끝에 마커를 배치합니다 \n(이 경우 패턴 공간에서 개행 문자를 찾을 수 없다는 것이 보장되기 때문입니다).sed
  • 그런 다음 6번째 필드의 내용을 7번째 필드에 넣는 작업을 수행합니다.

관련 정보