FNRとNR変数の問題

FNRとNR変数の問題

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 .. | awkawkを使用して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

おすすめ記事