2つの方法でファイルを比較すると、少し不満を感じます。
- ファイル1
bill telephone address_1 address_2 address_3 city postal_code
- ファイル2
Bill Bill_ID Telephone Address_1 Address_2 city Postal_Code
2つのファイルを一意の値で埋めようとしています。したがって、私の予想結果は次のようになります。
+-----------+---------+
| File1 | File2 |
+-----------+---------+
| | Bill_ID |
| address_3 | |
+-----------+---------+
私が達成しようとしているもの:
sdiff
最初はアルファベット順にソートされましたが、すべての列が生成されました。または
sdiff -Wais File1.txt File2.txt | awk '{print $1}' | sort -u
ところで、ファイルを反転して2回実行する必要があります。
comm
しかし、このようなエラーがあります。comm -23 < (sort File1.txt) <(sort File2.txt) bash: syntax error near unexpected token '('
diff
しかし、出力が間違っているようです。diff File_1 File_2 | grep '^>' | cut -c 3-
これらすべてのケースで私が直面している問題は単なる比較です。正しいテーブルを入力できませんでした。
答え1
join
結合キーとしてテキストの小文字バージョンを使用できます。
$ preprocess() { awk -v OFS='\t' '{print tolower($0), $0}' | sort -t $'\t' -k1,1; }
$ join -t $'\t' -o1.2,2.2 -v1 -v2 <(preprocess < file1) <(preprocess < file2)
address_3
Bill_ID
答え2
公開した入力例のように、両方の入力ファイルに同じ単語が複数回表示されないとし、すべてのUnixシステムのすべてのシェルでawkを使用します。
$ cat tst.awk
BEGIN {
OFS="\t"
print ARGV[1], ARGV[2]
}
{ lc = tolower($1) }
NR==FNR {
file1[lc] = $1
next
}
lc in file1 {
delete file1[lc]
next
}
{
print "", $1
}
END {
for (lc in file1) {
print file1[lc], ""
}
}
$ awk -f tst.awk file1 file2
file1 file2
Bill_ID
address_3
答え3
この試みアッ。すぐに利用可能な数に関係なく、すべてのファイルを操作できます。
注:space入力データの単語の末尾にあるsに注意してください。
$ awk '{ str=tolower($0); a[str]++; aa[str]=$0; b[str]=b[str]" "FILENAME }
END{ for(i in a){ if(a[i]==1){ print aa[i],b[i] } } }' file1 file2
address_3 file1
Bill_ID file2
テーブルなどの出力が必要な場合は、電子にawk形式を追加してください。結果をコピーしてExcelなどに貼り付けることができます。もちろん、文字列のTABsとsは,型を台無しにします。
$ awk '{ str=tolower($0); a[str]++; aa[str]=$0; b[str]=b[str]","FILENAME }
END{ for(i in a){ if(a[i]==1){ print aa[i]b[i] } } }' file1 file2 |
awk -F ',' '{ nm_a[$NF]++; a[$NF,nm_a[$NF]]=$1 }
END{ for(i in nm_a){ printf "%s\t",i; if(max<nm_a[i]){ max=nm_a[i] } };
print ""; for(j=1;j<=max;j++){ for(i in nm_a){ printf "%s\t",a[i,j] }
print "" } }'
file2 file1
Bill_ID address_3