두 개의 파일이 있습니다. 하나는 10개의 레코드가 있고 다른 하나는 15개의 레코드가 있습니다. 문제는 cat
파일을 합칠 때 항상 작동한다는 것 입니다 FNR=NR
.
예를 들어 다음 파일을 고려해보세요.
파일 1:
1,boo
2,foo
3,boo
파일 2:
1,boo
2,foo
3,boo
4,foo
다음 코드를 적용할 때:
cat File1 File2 | awk -F, '{print FNR}'
결과는 다음과 같습니다.
1
2
3
1
2
3
4
하지만 제가 실제로 가지고 있는 것은 FNR
= 1부터 7까지입니다.
답변1
대신 이것을 사용하십시오:
awk -F, '{print FNR}' file1 file2
awk의 변수는 FNR
각 입력 파일의 레코드 수를 제공합니다. 그러나 cat .. | awk
awk를 사용하여 stdin 파일 설명자를 읽으면 awk는 1개의 "파일"만 봅니다.
더 나은 이해를 위해 다음을 시도해 보십시오( FILENAME
현재 처리 중인 파일을 사용하여).
$ awk -F, '{print FILENAME" "FNR}' file1 file2
file1 1
file1 2
file1 3
file2 1
file2 2
file2 3
file2 4
$ cat file1 file2 | awk -F, '{print FILENAME" "FNR}'
- 1
- 2
- 3
- 4
- 5
- 6
- 7
FILENAME
첫 번째 예에서 볼 수 있듯이 두 번째 예 에는 표준 입력을 나타내는 2개의 파일이 처리되고 있습니다 -
.
편집하다:다음 예를 참조하세요.
$ cat file1 | awk -F, '{print FILENAME" "FNR}' - file1 <(cat file1)
- 1
- 2
- 3
file1 1
file1 2
file1 3
/dev/fd/63 1
/dev/fd/63 2
/dev/fd/63 3
먼저 awk는 stdin에서 읽습니다(이 cat file1
부분은 awk에 대한 인수로도 사용됩니다 -
). 그런 다음 일반적인 내용이 있습니다 . 마지막으로 awk가 읽는 파이프( )를 생성하는 부분이 file1
있습니다 .<(cat file1)
/dev/fd/63
답변2
이들을 cat
연결( )하면 awk
단 하나의 파일이 됩니다(이 경우 표준 입력). 원하는 결과를 얻으려면 대신 실행하십시오.
awk -F, '{print FNR}' File1 File2
답변3
이것은 정확하지 않습니다. 파일을 캡처하여 파이프라인으로 보내면 더 이상 파일을 개별적으로 계산하지 않고 파이프라인의 모든 입력을 단일 파일로 가져옵니다.