awk를 사용하여 파일의 두 번째에서 마지막 줄을 인쇄하는 방법 [duplicate]

awk를 사용하여 파일의 두 번째에서 마지막 줄을 인쇄하는 방법 [duplicate]

각각 다른 번호나 기록을 가진 여러 개의 파일이 있습니다. 두 번째부터 마지막 ​​줄까지 인쇄하고 일부 변경을 수행하는 awk 명령을 원합니다. 나는 다음과 같은 것을 원합니다: (물론 이것은 작동하지 않습니다)

awk '( NR == FNR-1 ), $0","' *.txt

답변1

awk레코드가 오면 읽고, 아직 읽지 않았다면 끝에서 얼마나 떨어져 있는지 알 수 없습니다(현재 레코드를 읽고 처리한 후에 추가 레코드가 추가될 가능성이 높습니다).

대신 sed어느 것이 마지막 레코드인지조차 알 수 없습니다( 어느 것이 마지막 레코드인지 알 수 있도록 미리 하나의 레코드를 내부적으로 읽어 실제로 주소를 가집니다) sed.$

END그러나 특수 명령문의 끝에서 또는 각 입력 파일(명령문 내)을 처리한 후 GNU를 사용하여 일부 처리를 수행할 수 있습니다.awkENDFILE

따라서 처리하는 동안 마지막 두 레코드를 저장한 다음 END/ 문 ENDFILE에 저장한 위치에서 두 번째 레코드를 호출할 수 있습니다 .

예를 들어:

awk '{prevlast = last; last = $0}
     END {if (NR >= 2) print "penultimate:", prevlast}' < input

또는:

gawk '{prevlast = last; last = $0}
      ENDFILE {
       if (FNR >= 2) print "penultimate for", FILENAME ":", prevlast
      }' file1 file2

또는 끝에서부터 n번째로 일반화합니다.

awk -v n=2 '{saved[NR % n] = $0}
     END {if (NR >= n) print saved[(NR + 1) % n]}' < input

gawk -v n=2 '{saved[FNR % n] = $0}
     ENDFILE {if (FNR >= n) print saved[(FNR + 1) % n]}' file1 file2

답변2

,두 번째부터 마지막 ​​줄 끝에 쉼표를 추가하고 각 파일을 제자리에서 수정합니다.

sed해결책:

샘플 file1.txt:

C2-C1 1.5183
C3-C2 1.49
C3-C1 1.4991
O4-C3 1.4104
C1-C2-C3 59.78

샘플 file2.txt:

C2-C1 1.5052
C3-C2 1.505
C3-C1 1.5037
S4-C3 1.7976
C1-C2-C3 59.95

sed -i 'x; ${s/.*/&,/;p;x}; 1d' file*.txt

결과 보기:

$ head file[12].txt
==> file1.txt <==
C2-C1 1.5183
C3-C2 1.49
C3-C1 1.4991
O4-C3 1.4104,
C1-C2-C3 59.78

==> file2.txt <==
C2-C1 1.5052
C3-C2 1.505
C3-C1 1.5037
S4-C3 1.7976,
C1-C2-C3 59.95

관련 정보