ファイル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.Y
。Y
X
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.txt
file1.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