最初のゲーム - アイク

最初のゲーム - アイク

次の値を持つファイルを考えてみましょう。

foo
boo
too

そしてもう一つ:

foo,1
foo,2
boo,1 
soo,1

出力が次の2番目のファイルから最初の一致のみを取得するにはどうすればよいですか?

foo,1
boo,1

答え1

どうですか?

$ awk -F, 'NR==FNR {a[$1]; next} $1 in a {print; delete a[$1]}' file1 file2
foo,1
boo,1 

答え2

有名なイディオムの変形。

awk -F, 'FNR==NR{a[$1]=1;next} a[$1]++==1' file1 file2

修正する

soo,#@dave_thompson_085が指摘したように、2番目のファイルに複数のファイルがある可能性があるため、a[$1]++==12番目のファイルも同じことを行います。彼はまた、次のようないくつかの解決策を提示しました。

awk -F, 'FNR==NR{a[$1]=1;next} !--a[$1]' file1 file2

答え3

実際ではありませんが、うまくawkいきます。簡単に拡張できると思います。

#!/usr/bin/env bash

while IFS= read -r line; do
    grep -m1 "$line" "$2"
done < "$1"
$ ./script.sh file1 file2

一行ずつ読むhttps://stackoverflow.com/questions/10929453/read-a-file-line-by-line-locationing-the-value-to-a-variable
その後、「file2で最初の行の内容を探します。」

答え4

私もawkを使用しましたが、方法が異なります

注文する

awk -F "," 'NR==FNR{a[$1];next}($1 in a){print $0}' file1.txt file2.txt| awk -F "," '{if (!seen[$1]++)print }'

出力

awk -F "," 'NR==FNR{a[$1];next}($1 in a){print $0}' file1.txt file2.txt| awk -F "," '{if (!seen[$1]++)print }'
foo,1
boo,1 

関連情報