次のファイルがあります。
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というファイルにpopularity
。fileA
一意のキーを含むように変更
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}'
標準出力として。
答え2
paste
2つの「テーブル」ファイルをまとめて出力をパイプに接続し、sort
4cut
列目だけを保持できます。
テストされていない(現在はモバイル)試みは次のとおりです。
paste fileA fileB | sort -s -k3,3 | cut -f4
答え3
以下を使用してアルファベットマッピングを取得できます。
paste <(awk '{print $NF}' fileA.txt | sort -u) <(sort -u fileB.txt)
north boring
south popular
west someWhatPopular
その後、awkを使用して次の形式で目的の出力を生成できます。
awk '
NR==FNR {map[$1] = $2; next}
{print map[$NF]}
' <(paste <(awk '{print $NF}' fileA.txt | sort -u) <(sort -u fileB.txt)) fileA.txt
someWhatPopular
someWhatPopular
someWhatPopular
popular
boring
someWhatPopular