0

2つのファイルがあります。1つには名前のリスト(1列のみ)があり、2番目のファイルには名前、電話番号、国の3つの列があります。

私が欲しいのは、名前がファイル1には存在せず、ファイル2にのみ存在する人々のデータを抽出することです。

#!/bin/bash

for i in `cat file1 `
   do
      cat file2 | awk '{ if ($1 != "'$i'") {print $1 "\t" $2 "\t" $3 }}'>>NonResp
   done

私が得たのは、予想よりも多くのデータを含む奇妙な結果です。

親切に助けてください。

4

3 に答える 3

1
awk '{print $1}' file2 | comm -1 -3 file1 - | join file2 -

これが正しく機能するためには、ファイルがすでにソートされている必要があります。説明:

=> awk '{print $1}' file2 |

file2の最初のfileldのみを出力し、それを次のコマンドにフィードします(|)

=> comm -1 -3 file1 - |

file1と最後のコマンドの出力(-)を比較し、file1(-1)の行と両方のファイル(-3)の行を抑制します。file2にのみ行を残し、これを次のコマンドにフィードします(|)

=> join file2 -

元のfile2と最後のコマンド(-)からの出力を結合し、一致する行のフィールドを書き出します(ただし、フィールド間の空白は切り捨てられます)

テストケース:

cat << EOF> file1
アラン
バート
シンディ
デイブ
フレッド
日当たりの良い
テッド
EOF

cat << EOF> file2
バート01AU
シンディ03CZ
ginny 05 CN
ted 07 CH
zorro 09 AG
EOF

awk'{print $ 1}' file2 | comm -1 -3 file1-| file2-に参加
于 2012-09-06T12:07:24.887 に答える
1

,file2でフィールド区切り文字を""と想定

awk -F, 'FNR==NR{a[$1];next}!($1 in a)' file1 file2

,」が区切り文字でない場合は、単に

awk 'FNR==NR{a[$1];next}!($1 in a)' file1 file2

十分でしょう。

于 2012-09-06T12:25:49.203 に答える
1

あなたはこれを行うことができますgrep

grep -v -F -f file1 file2
于 2012-09-06T12:46:18.940 に答える