ファイルAの内容を変更せずに、ファイルAの列3に基づいてファイルBをソートします。

ファイルAの内容を変更せずに、ファイルAの列3に基づいてファイルBをソートします。

次のファイルがあります。

cat fileA.txt

seattle    1991  west
atlanta    1993  west
turlock    1998  west
marysville 2004  south
newyork    2007  north
canada     2004  west

2番目のファイルは次のとおりです。

cat fileB.txt

popular
someWhatPopular
boring
popular
popular
popular

次の出力を取得したいですfileB.txt

popular popular popular someWhatPopular boring popular

だから本質的に私は3番目の列にfileB.txtソートしたいですfileA.txt

次のコードを試しました。

   #!/bin/bash
   sort -s -k3,3 fileA.txt fileB.txt

しかし、それはうまくいきませんでした。どんな提案がありますか?私はハードコーディングを必要としないすべてに開いています。バッシュ/awk/sedなど

ベストアンサー1

これはLinuxよりも重要なデータ構造の問題です。 「データベース」と同様に、2つのテーブルをリンクするには2つのテーブルに共通のエントリ(キー)が必要であり、データテーブルの最初の列に一意のキーを保持することをお勧めします。その後、お気に入りのコンテンツを並べ替えてリンクできます。

@glennjackmanのマップと同じものを使用して、マップキーを北、南などとして定義できます。

1 south somewhatPopular
2 west popular
3 north boring
4 east unexplored

fileというファイルにpopularityfileA一意のキーを含むように変更

1 seattle    1991  west
2 atlanta    1993  west
3 turlock    1998  west
4 marysville 2004  south
5 newyork    2007  north
6 canada     2004  west

joinその後、選択したキー(あなたの列2はpopularity列4にマップされますfileA)を操作してこれらのファイルを操作できますが、join 両方のファイルはキーフィールドでソートする必要があります。

join -1 4 -2 2 <(sort -k4 fileA) <(sort -k2 popularity) | sort -k2 | awk '{print $6}'

popular
popular
popular
somewhatPopular
boring
popular

少し大きなハンマーアプローチですが、最大の柔軟性を提供します。

各パイプラインで上記のコマンドを分析すると、各ステップの機能を確認できます。

編集:説明join -1 4 -2 2 # its in the man pages

これはjoin、表1の4番目の列(-1 4)を見て、表2の2番目の列(-2 2)で一致する値を見つけることを意味します。

joinその後、2つのテーブルの列を単一のテーブルに結合しますが、キー列は一度だけ含めます(北など)。出力ビュー

join -1 4 -2 2 <(sort -k4 fileA) <(sort -k2 popularity)

より明確でなければなりません

joinこれが機能するにはデータテーブルをソートする必要があるため

| sort -k2

テーブルを結合すると、元の順序に戻ります。

目的の列は結合テーブルの列6なので、

| awk '{print $6}'

標準出力として。

おすすめ記事