bash 및 awk 명령이나 기타 명령을 사용하여 수정하고 싶은 CSV 파일이 있습니다.
예를 들어 E열이나 F열이 비어 있거나 값이 0인 경우 B열을 복사하고 싶습니다.
AAAA, BBBB, CCCC, DDDD, EEEE, FFFF
11 12 13 14 15 0
산출:
AAAA, BBBB, CCCC, DDDD, EEEE, FFFF
11 12 13 14 15 12
어떻게 해야 하나요?
업데이트: cat user.csv를 실행했는데 이것이 표시되었습니다.
740.58,0,740.58,0,740.58
2452.84,0,2452.84,0,2452.84
898.23,0,898.23,0,898.23
227.57,0,227.57,0,227.57
735.02,0,735.02,0,735.02
640.5,0,640.5,0,640.5
469.31,0,469.31,0,469.31
3744.25,0,3744.25,0,3744.25
462.15,0,462.15,0,462.15
198.79,0,198.79,0,198.79
437.58,0,437.58,0,437.58
515.44,0,515.44,0,515.44
LibreOffice에서는 이렇게 보입니다.
그래서 제가 하고 싶은 것은 C 열의 정보를 B 열로 바꾸는 것입니다. B 열의 모든 정보가 0이면, 0이 아니면 아무것도 변경하지 말고 설명하겠습니다.
미안 내 영어 실력이 별로 좋지 않아 :c
업데이트: 진술이 다음과 같은 경우:
if [[ $2 == 0 ]]; then echo "열 3을 열 2로 복사" awk -F , 'BEGIN { OFS = FS } $2 == 0 { $2 = $3 } 1' user.csv > user1.csv else if [[ $4 == 0 ]]; then echo "열 5를 4로 복사" awk -F , 'BEGIN { OFS = FS } $4 == 0 { $4 = $5 }' csv > user1.csv fi fi
답변1
gawk '
BEGIN {FS = OFS = "\t"}
!$5 {$5 = $2}
!$6 {$6 = $2}
1
' input.tsv
출력이 올바르면 다시 실행하세요.gawk -i inplace '...' input.tsv
답변2
$ awk -F , 'BEGIN { OFS = FS } $2 == 0 { $2 = $3 }; 1' user.csv
740.58,740.58,740.58,0,740.58
2452.84,2452.84,2452.84,0,2452.84
898.23,898.23,898.23,0,898.23
227.57,227.57,227.57,0,227.57
735.02,735.02,735.02,0,735.02
640.5,640.5,640.5,0,640.5
469.31,469.31,469.31,0,469.31
3744.25,3744.25,3744.25,0,3744.25
462.15,462.15,462.15,0,462.15
198.79,198.79,198.79,0,198.79
437.58,437.58,437.58,0,437.58
515.44,515.44,515.44,0,515.44
awk
이는 두 번째 필드의 숫자 값이 0인 경우 각 레코드(행)의 두 번째 필드(열)를 세 번째 필드의 값으로 설정하는 데 사용됩니다.
이 BEGIN
블록은 단순히 출력 필드 구분 기호를 입력 필드 구분 기호(명령줄에서 사용하여 설정한 쉼표 -F
)로 설정합니다.
꼬리는 모든 레코드가 무조건 인쇄되도록 하는 1
와 동일합니다 .{ print }
질문에 대한 업데이트와 관련하여 : 열 2가 0이면 (위와 같이) 열 3을 열 2에 복사하고 동시에 열 4가 0이면 열 4에 열 5를 복사하려면 위의 코드는 쉽게 다음과 같이 확장됩니다.
awk -F , 'BEGIN { OFS = FS }
$2 == 0 { $2 = $3 }
$4 == 0 { $4 = $5 }; 1' user.csv