ファイル1
james:hello
richard:hello2
johnson:hello3
jam3es:hello
ja1mes:hello
ファイル2
james:hello
ja1mes:hello
johnson:hello3
期待される出力
richard:hello2
jam3es:hello
これら2つのファイルがあり、最初の列(別名)を他のファイル名と比較し、File1の唯一の行を印刷しようとしています。
答え1
私が想像できるどのロケールでも、ファイルが最初の列でソートされていないようですが、ソートするとexjoin
オプションを簡単に使用できます-v
。
$ join -t ':' -v 1 <(sort -t ':' file1) <(sort -t ':' file2)
jam3es:hello
richard:hello2
与えられた順序で出力が本当に必要な場合は、結果を別のsort
コマンドにパイプできます。
答え2
awkはきちんとした解決策を提供します
awk -F: '
NR == FNR {name[$1]; next}
!($1 in name)
' file2 file1
出力
richard:hello2
jam3es:hello
サンプル入力ファイルは、行全体が繰り返されることを示しています。これが本当にそうであれば、次のcomm
ユーティリティが便利です。
comm -23 <(sort file1) <(sort file2)
ファイル1に表示される行のみを出力する(オプションは-2
ファイル2にのみ表示される行を抑制し、-3
共通行を抑制します)
jam3es:hello
richard:hello2