ファイルの並べ替えと参加

ファイルの並べ替えと参加

2つのファイルがあります。ファイルをソートして最初の列に参加したいです。たとえば、

最初のファイル:

100.   ttt
200.   616te
300.   7a27
       7373qq

2番目のファイル:

100.   ttt
200.   yoga
300.   7a27
       8371gd

これら2つのファイルを結合するには、次のようにします。

join <(sort first_file.txt) <(sort second_file.txt) >joined.txt

私が得たい結果は次のとおりです。


100.   ttt.      ttt
200.   616te.    yoga
300.   7a27.     7a27
       7373qq.   8371gd

次に、列2と列3が異なる行を見たいと思います。そのために、私は次のことを行います。

awk '$2!=$3 {print $1, $2, $3}' joined.txt >different.txt

ご覧のとおり、最初の2つのファイルの値の一部は空です。したがって、Joinを使用すると、次のエラーが発生します。

join: /dev/fd/63:26456: is not sorted: 100  7373qq
join: /dev/fd/62:23295: is not sorted: 100  8371gd

この問題にどのように対処する必要がありますか?洞察力を高く評価いたします。

ベストアンサー1

これが必要なすべてでない場合は、目的の効果がない場合を含む、より実際的な入力例と予想される出力を提供するように質問を編集します。

$ paste file1 file2 | sed 's/\t[^ ]* */.\t/'
100.   ttt.     ttt
200.   616te.   yoga
300.   7a27.    7a27
       7373qq.  8371gd

上記の中間出力と最終比較出力が必要な場合は、次のようにします。

$ paste file1 file2 | sed 's/\t[^ ]* */.\t/' | tee intermediate | awk '($NF".")!=$(NF-1)'
200.   616te.   yoga
       7373qq.  8371gd

またはそうしない場合:

$ paste file1 file2 | awk '{sub(/\t[^ ]* */,".\t")} ($NF".")!=$(NF-1)'
200.   616te.   yoga
       7373qq.  8371gd

.または、実際に2番目のフィールド値の末尾に追加する必要がない場合:

$ paste file1 file2 | awk '{sub(/\t[^ ]* */,"\t")} $NF!=$(NF-1)'
200.   616te    yoga
       7373qq   8371gd

おすすめ記事