別のソリューション

 別のソリューション

大容量ファイルがあります: (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

関連情報