3

私は2つのファイルを持っています:

猫ファイル1:

0 xxx
1 yyy
1 zzz
0 aaa

猫ファイル2:

A bbb
B ccc
C ddd
D eee

awk を使用して次の出力を取得するにはどうすればよいですか。

B ccc
C ddd

私の質問は、file1 の特定のフィールド (つまり、フィールド 1) が特定の値 (つまり、1) と一致する場合にのみ、file2 から行を出力するにはどうすればよいですか?

追加情報:

ファイル file1 と file2 の行数は同じです。

ファイル file1 と file2 には数百万行あり、メモリに読み込むことができません。

file1 には 4 つの列があります。

file2 には約 1000 の列があります。

4

3 に答える 3

3

これを試してください(少し難読化されています):

awk 'NR==FNR{a[NR]=$1}NR!=FNR&&a[FNR]' file1 file2

複数の行では、より明確になる可能性があります(リマインダー、awk次のように機能しますcondition{action}::

awk '
    NR==FNR{arr[NR]=$1}
    NR!=FNR && arr[FNR] 
' file1 file2

スニペットの「賢い」部分を削除すると:

awk '
    if (NR == FNR) {arr[NR]=$1}
    if (NR != FNR && arr[FNR]) {print $0} 
' file1 file2

のようにawk単独で (アクションなしで) 条件を見つけると、NR!=FNR && arr[FNR]デフォルトで onSTDOUT暗黙的に出力されます is the expressions is TRUE(> 0)

説明

  • NR入力の開始から現在のレコードの番号です
  • FNR現在のファイルの現在のレコードの序数です( 2 番目のファイルNRとは異なりFNRます)。
  • arr[NR]=$1:最初の列でarr現在のインデックスを配列に供給NR
  • 次のファイルNR!=FNRにいて、配列の値が の場合1、出力します
于 2013-03-15T13:43:01.270 に答える
2

awk ソリューションほどクリーンではない

$ paste file2 file1 | sed '/0/d' | cut -f1
B
C

何百万もの行について言及しましたが、ファイルを1回通過するだけで、pythonに頼ります。おそらくこのようなもの(python 2.7):

with open("file1") as fd1, open("file2") as fd2:
    for l1, l2 in zip(fd1, fd2):
        if not l1.startswith('0'):
            print l2.strip()
于 2013-03-15T13:46:26.573 に答える
2
awk '{
  getline value <"file2";
  if ($1)
    print value;
}' file1
于 2013-03-15T13:46:39.270 に答える