私の目的は、2つの異なるcsvファイルの特定の列を比較し、最初のファイルにない2番目のファイルからデータをインポートすることです。例えば。
最初のファイル
"siddhartha",1
"mukherjee",2
2番目のファイル
"siddhartha",1
"mukherjee",2
"unique",3
期待される出力
"unique",3
次のコマンドは、最初の列のテキストサイズが制限されているとうまく機能するため、上記の例でもうまく機能します。
awk -F',' 'FNR==NR{a[$1];next};!($1 in a);' file1.csv file2.csv > file3.csv
ただし、最初の列のテキストサイズはかなり大きく(たとえば10000文字)、機能しません。特定のポイントでテキストを切り取ります。
解決策はありますか?
答え1
上記の簡単な例に基づいてこれが機能します。最初の列のデータが別の列で終わるか、データに空白がある場合は失敗します。
bashとGNU grepを使用してください。
grep -v -Ff <(cut -d',' -f 1 file1.csv) file2.csv > file3.csv
説明する
-v
逆マッチング-Ff
ファイルをスキーマソースとして使用する<(cut -d',' -f 1 file1.csv)
データの最初の列を取得し、「ファイル」として使用します。
答え2
awkを使用しない解決策は次のとおりです。ミラー:
$ mlr --nidx join -u -j 1 --np --ur -f file1.csv file2.csv
"unique",3
説明する:
--nidx
列は位置に応じて索引付けされるため(つまり、ヘッダー行はありません)-u
接続オプションにはソート入力は必要ありません。-j 1
左右のファイルの列1を結合します。--np --ur
ペアの行をエクスポートしないで、ペアのない行を右側のファイルにエクスポートします。