Bash의 stdin 파이프를 통해 파일에서 줄 제거

Bash의 stdin 파이프를 통해 파일에서 줄 제거

다음 스크립트를 사용하세요.

awk '{print $0"\t"NR}' test | grep NA | awk '{print $21}'

"NA"가 포함된 파일에서 줄 번호를 얻고 있습니다.

326
399
672
1512
1734
1737
2212

사용sed, 마지막 awk 명령 다음에 파이핑하여 동일한 명령의 표준 입력을 통해 파일에서 이 줄을 제거할 수 있습니까? 그렇지 않다면 간단한 방법이 있습니까?

답변1

더 쉬운 방법은 다음을 사용하는 것입니다 sed.

sed '/NA/d' test >test.new

내부 편집을 위해 GNU를 사용하려는 경우 sed(이렇게 하면 파일이 수정됨 test):

sed -i '/NA/d' test

sed표현식은 정규 표현식과 일치하는 입력의 모든 행에 명령을 적용합니다 /NA/d. 이 명령은 행을 삭제합니다.dNAd


행 번호가 다음과 같은 경우모두그렇다면 다음도 작동합니다.

some_command | sed 's/$/d/' | sed -f /dev/stdin test >output

여기서 some_command파일에서 제거하려는 줄 번호를 생성합니다 test.

첫 번째는 sed각 줄에 a를 추가하여 숫자 스트림을 스크립트로 변환합니다. 행 읽기는 "행 100 삭제"로 해석됩니다. 그런 다음 이는 실제 스크립트로 두 번째 스크립트(스크립트를 읽는)에 공급되어 파일에 적용됩니다.sedd100dsed/dev/stdintest

셸에서 프로세스 대체에 해당하는 내용을 알아보세요.

sed -f <( some_command | sed 's/$/d/' ) test >output

그러나 해당 문자열이 포함된 행만 삭제하려는 경우 NA이는 어리석은 일입니다 .

답변2

awk그냥 명령어로 쓰면 너무 지루하지 않을까요?

awk '!/NA/' test 

기본 작업은 전체 줄에 대한 것이므로 포함되지 않은 줄을 인쇄하는 것과 같습니다 print.!/NA/ { print $0 }NA

관련 정보