AWK를 사용하여 특정 열에서 특정 값을 가진 행 선택


6

큰 csv 파일이 있는데 다음과 같습니다.

1,2,3,4,5,6,-99
1,2,3,4,5,6,-99
1,2,3,4,5,6,-99
1,2,3,4,5,6,25178
1,2,3,4,5,6,27986
1,2,3,4,5,6,-99

7 번째 열이 -99와 같은 줄만 선택하고 싶으므로 출력은 다음과 같습니다.

1,2,3,4,5,6,-99
1,2,3,4,5,6,-99
1,2,3,4,5,6,-99
1,2,3,4,5,6,-99

나는 다음을 시도했다.

awk -F, '$7 == -99' input.txt > output.txt
awk -F, '{ if ($7 == -99) print $1,$2,$3,$4,$5,$6,$7 }' input.txt > output.txt

그러나 둘 다 빈 output.txt를 반환했습니다. 아무도 내가 뭘 잘못하고 있는지 말해 줄 수 있습니까? 감사.


3
첫 번째 명령은 나를 위해 작동하고 두 번째 명령은 사소한 오타 (인쇄 stmt의 닫는 괄호)가 있으며 OFS를 설정하지 않습니다 ... awk 버전은 무엇입니까? 아마도 스타일 라인 엔딩이 있습니까? (그러나 확인했을 때 문제가 발생하지 않습니다)
Sundeep

내 awk 버전을 어떻게 알 수 있습니까? 예, 여기에 잘못 입력했지만 스크립트에는 맞습니다.
Isabela Martins

오래 awk되면 시도 할 수 awk -F, '$7 == "-99"'있습니다.
사토 카츠라

버전에 awk --version대해서는 작동하지 않는 경우 명령을 시도 하십시오.man awk
Sundeep

내 버전은 1.2
Isabela Martins

답변:


5

스크립트를 실행하는 파일에는 DOS 줄 끝이 있습니다. Windows 시스템에서 작성된 것일 수 있습니다.

dos2unix파일을 Unix 텍스트 파일로 변환하는 데 사용하십시오 .

또는 다음을 통해 실행하십시오 tr.

tr -d '\r' <input.txt >input-unix.txt

그런 다음 input-unix.txt올바른 awk코드 와 함께 사용 하십시오 .


awk입력 파일 대신 코드 를 수정하려면

awk -F, '$7 == "-99\r"' input.txt >output.txt

줄 끝의 캐리지 리턴이 고려됩니다.

또는,

awk -F, '$7 + 0 == -99' input.txt >output.txt

이렇게하면 7 번째 열이 캐리지 리턴을 "제거"하는 숫자로 해석됩니다.

비슷하게,

awk -F, 'int($7) == -99' input.txt >output.txt

또한 제거합니다 \r.


"-99 \ r"을 시도했는데 효과가있었습니다! 그거였다. 대단히 감사합니다 !!
Isabela Martins

1
awk -F, '{if($7==-99)print $0}'

그렇게 할 것입니다 ...


1
awk -F, '$7 == -99' input.txt질문에서와 마찬가지로 awk코드를 올바르게 얻는 것보다 다른 일이 있음을 의미합니다 .
Kusalananda

빈 출력 ...
Isabela Martins

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.