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