awk는 특정 열에서 인수가 발견되면 행을 삭제합니다.

awk는 특정 열에서 인수가 발견되면 행을 삭제합니다.

알 수 없는 크기의 전체 파일을 반복하고 지정된 열에서 지정된 단어(매개변수 1로 전달됨)가 발생하는 모든 행을 제거해야 합니다. 또한 삭제된 행 수를 추적해야 합니다. 나는 이것이 awk의 일이라고 가정하고 있지만 많은 어려움을 겪고 있습니다. awk match를 사용해 보았지만 다른 구문 문제 외에 인수를 단어로 변환할 수 없습니다.

예(file.txt):

Katie 1234 4567 blue
Ben 3456 2345 purple
Alex 7896 6789 blue

$ script.sh blue 4

파일을 다음과 같이 편집합니다.

Ben 3456 2345 purple

그리고 출력:2 lines removed

나는 단지 코드를 얻는 것보다 내가 하고 있는 일을 이해하는 데 더 관심이 있습니다.

답변1

#!/bin/sh
awk -v value="$1" -v column="$2" '
  $column == value {++removed; next}
  1 {print}
  END {print removed " lines removed" >"/dev/stderr"}
' <File.txt >File.txt.tmp &&
mv File.txt.tmp File.txt

설명하다:

  • -v value="$1"awk 변수를 value쉘 스크립트의 첫 번째 매개변수로 설정하십시오.
  • 각 라인에 대해 조건이 $column == valuetrue이면 중괄호 안의 코드가 실행됩니다.
    • $column열 번호의 내용입니다 column(1부터 시작).
    • ++removed삭제된 행의 카운터를 증가시킵니다. 변수는 0부터 시작합니다.
    • nextprint조건이 true인 경우 명령이 실행되지 않도록 다음 입력 라인으로 점프합니다 .
  • 1 {print}next명령 실행을 유발하지 않은 각 행을 인쇄합니다 . ( 1항상 참인 조건입니다.)
  • END {…}입력 끝 부분에 중괄호로 묶인 코드를 실행합니다.
  • awk 코드는 임시 파일에 쓴 다음 해당 위치로 이동합니다.

관련 정보