次のファイルを検討してください。
ファイル1:
1
2
3
4
ファイル2:
2
3
6
9
予想出力:
1 NULL
2 2
3 3
4 NULL
NULL 6
NULL 9
試してみましたが、paste file1 file2 | sed 's/\t/\0\t/g' | column -s $'\t' -t
好きな効果が出ません。
答え1
commコマンドは、要件に近い形式で目的の結果を提供できます。私のシステムにはcomm(GNU coreutils)8.25がデフォルトでインストールされています。テストのために、データと追加の数値を含む2つのファイルbとc txtを作成しました。
comm --nocheck-order b.txt c.txt #(or file1.txt file2.txt)
出力:
1
2
3
4
6
8
9
10
11
13
16
17
18
19
20
22
最初の列には、ファイル2と一致しないファイル1のエントリが含まれています。
2番目の列は、ファイル1と一致しないファイル2のエントリを表します。
3番目の列は、ファイル1と2の共通/一致項目を表します。
ファイルがソートされているが、何らかの理由でcommがソートされていないファイルについて文句を言います。 --nocheck-orderスイッチを使用してこの問題を解決できます。
リストはカスタム区切り文字で書式設定できます(man commを参照)。
これでリストを作成したので、次のように操作できます。
readarray data < <(comm --nocheck-order --output-delimiter "-" b.txt c.txt)
for ((i=0;i<${#data[@]};i++)); do
va=$(grep -e "-" <<<"${data[$i]}")
if [[ $va == "" ]]; then
echo ${data[$i]} " null"
elif [[ $va == "--"* ]]; then
data2=$(echo ${data[$i]} | grep -Po '[0-9]*')
echo $data2 " " $data2
else
data2=$(echo ${data[$i]} | grep -Po '[0-9]*')
echo "null " $data2
fi
done
他の興味深いコマンドはJoinとsdiffですが、commが最も近いです。次の記事も確認できます。 https://askubuntu.com/questions/515900/how-to-compare-two-files
挨拶