2つのファイルがあります。 1 つは 10 個のレコードがあり、もう 1 つは 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番目の例では標準入力を表す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