大容量ファイルがあります: (file1.csv)
id,code,N
10214411,008.8,1
10214411,038.9,1
10214411,04.81,1
10214411,07.22,1
IDリストを含む2番目の列に基づいて新しいファイルを選択して生成しようとしています。例:
2番目のファイルの2番目の列には大きなIDのリストがあります。例: (file2.csv):
0.008.8
07.22
結果:(ファイル3.csv)
id,code,N
10214411,008.8,1
10214411,07.22,1
答え1
0.008.8
あなたの質問のfile2.csvにタイプミスがあり、次のようにする必要があると仮定すると、008.8
次のようになります。
awk -F, 'NR==FNR{a[$1]; next} FNR==1 || $2 in a' file2.csv file1.csv > file3.csv
たとえば、
$ awk -F, 'NR==FNR{a[$1]; next} FNR==1 || $2 in a' file2.csv file1.csv
id,code,N
10214411,008.8,1
10214411,07.22,1
答え2
このようにbash
シェルを使用paste
し、次の手順を実行しますawk
。
入力ファイル
$ cat file2.csv
008.8
07.22
パスワード
シェル変数にいくつかのトリックを使用して正規表現を作成します。
re="^($(paste -sd '|' file2.csv))$"
...現在、$re
変数に正規表現が含まれています。^(008.8|07.22)$
次に re を awk に変数として渡します。 (${re//./\\.}
bash引数はバックスラッシュ点に展開されます => ^(008\.8|07\.22)$
)
awk -F, -v re="${re//./\\.}" 'NR==1 || $2 ~ re' file1.csv | tee file3.csv
出力
$ cat file3.csv
id,code,N
10214411,008.8,1
10214411,07.22,1
別のソリューション
(未検証)
{
echo 'id,code,N'
while IFS=, read -r _ id __; do
awk -F, -v id=$id '$2==id' file1.csv
done < file2.csv
} | tee -a file3.csv
答え3
head
そしてgrep
一緒に仕事をします。grep -F
したがって、grepはfile2の行を正規表現ではなく固定文字列として扱います。
{
head -n 1 file1.csv
grep -F -f file2.csv file1.csv
}
id,code,N
10214411,008.8,1
10214411,07.22,1
ここでは、2つのコマンドの出力を同時にリダイレクトできるように中括弧を使用しています。
{ cmd1; cmd2; ...; } > output.txt