Linuxで大量のデータを含むファイルをソートしてリンクし、見つからない値を空の値として出力する方法

Linuxで大量のデータを含むファイルをソートしてリンクし、見つからない値を空の値として出力する方法

次のファイルを検討してください。

ファイル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

挨拶

関連情報