각각 다른 번호나 기록을 가진 여러 개의 파일이 있습니다. 두 번째부터 마지막 줄까지 인쇄하고 일부 변경을 수행하는 awk 명령을 원합니다. 나는 다음과 같은 것을 원합니다: (물론 이것은 작동하지 않습니다)
awk '( NR == FNR-1 ), $0","' *.txt
답변1
awk
레코드가 오면 읽고, 아직 읽지 않았다면 끝에서 얼마나 떨어져 있는지 알 수 없습니다(현재 레코드를 읽고 처리한 후에 추가 레코드가 추가될 가능성이 높습니다).
대신 sed
어느 것이 마지막 레코드인지조차 알 수 없습니다( 어느 것이 마지막 레코드인지 알 수 있도록 미리 하나의 레코드를 내부적으로 읽어 실제로 주소를 가집니다) sed
.$
END
그러나 특수 명령문의 끝에서 또는 각 입력 파일(명령문 내)을 처리한 후 GNU를 사용하여 일부 처리를 수행할 수 있습니다.awk
ENDFILE
따라서 처리하는 동안 마지막 두 레코드를 저장한 다음 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