2つのcsv +最初のファイルの最初の列+ 2番目のファイルの最初の列を連結し、一致する列データのみを取得します。

2つのcsv +最初のファイルの最初の列+ 2番目のファイルの最初の列を連結し、一致する列データのみを取得します。

ファイル1.txt

name
abc
xyz
pqr

ファイル2.txt

name,addr,id
abc,hj,1
pqr,hj.2
jkd,hj,9
jh,jd,2

結果ファイル

name,addr,id
abc,hj,1
pqr,hj.2

答え1

使用join:

join -t, -o 0,1.2,1.3 <(sort <(tail -n +2 file2)) <(sort <(tail -n +2 file1))
abc,hj,1
pqr,hj,2
  • -t,入力/出力フィールド区切り文字を次のように指定します。斑点
  • -o指定されたフィールドのみを出力します。0接続(最初)フィールドです(1.1またはで置き換え可能2.1)。形式は次のとおりですX.YYX

  • tail -n +2 infile最初の行を除くすべての行を返します。ヘッダーワイヤー。

  • sort ...各入力ファイルをソートします。

または以下を使用してawk

awk -F, 'NR==FNR {!seen[$1]; next} $1 in seen' file1 file2
name,addr,id
abc,hj,1
pqr,hj,2
  • -F,指定された入力フィールドの区切り記号は次のとおりです。斑点
  • NR==FNR;NR最初のレコード/行読み取りで1に設定されます。アッ単一の入力ファイルまたは複数のファイルのすべてのレコード/行を読み取るまでインクリメントし、FNR最初のレコード/行読み取りで1に設定されます。アッ現在の入力ファイルからすべてのレコード/行を読み取るまでインクリメントし、次のファイルで再び1にリセットされますNR==FNRアッ最初のfile1入力ファイルを読み込んでおり、後続のブロックが実行されます。seen次の行で呼び出される連想配列を作成します。ファイル1以前に設定されていない場合は、この配列のインデックスとして使用されます。

  • $1 in seen:2番目の項目のみが実行され、file2そのファイルの最初の列が配列のキーと一致することを確認してseen印刷します。

答え2

これは働きます:

grep --color=never -f <(cut -d, -f1 file1.txt | sed 's#.*#^\0,#') file2.txt 

説明する:

  • grep -f:FILE から 1 行に 1 つずつパターンを取得します。
  • --color=never(オプション)grep一致する出力から色を削除します。
  • <([...]) 次のように角かっこ間の内容に基づいてファイル記述子を生成する構文。
  • cut -d, -f1 file1.txtfile1.txt の最初の列を返します。
  • sed 's#.*#^\0,#'^column1,の正しいパターンを生成するのと同じように、最初の列を読み取るようにしますgrep

エラーを避けるためにヘッダーを除外するには(以下の例では不要です)、次のようにします。

head -n 1 file2.txt && \
grep --color=never -f <(tail -n +2 file1.txt | cut -d, -f1 | sed 's#.*#^\0,#') file2.txt

どちらのコマンドも以下を返します。

name,addr,id
abc,hj,1
pqr,hj.2

関連情報