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