
次の2つのファイルがあるとしましょう。
1 a one ...
2 b two ...
3 c three ...
4 d four ...
5 e five ...
6 f six ...
そして
a
c
f
どのような方法がありますか?ファイル1の列数がわかりません。(または各フィールドを繰り返す代わりに)結合を使用して一致する行を取得できます。
1 a one ...
3 c three ...
6 f six ...
頑張った
join -1 2 -o 1.0 file1 file2
あなたが書いたように、$0
すべてのフィールドを取得します。awk
しかし、私は明らかにそれを得ますinvalid field number
。
答え1
順番に印刷するフィールドを選択するか、すべてのフィールドをデフォルトの順序で印刷できます。ただし、「残りのフィールド」は印刷できません。
からman join
:
-o FORMAT
obey FORMAT while constructing output line
[...]
Any FIELD is a field number counted from 1. FORMAT is one or
more comma or blank separated specifications, each being
'FILENUM.FIELD' or '0'.
awkを使用できます。
awk -v regex="$(head -c -1 file2 | tr '\n' '|')" '$2 ~ regex' file1
- file2 の最後の改行文字を削除して改行文字を「|」に置き換えると、正規表現は次のようになります。
a|c|f
- file1の2番目のフィールドをこの正規表現と一致させます。
または、特にfile2に特殊文字が含まれている場合は、Sundeepのawkソリューションを使用してください。
答え2
あなたの場合、最初の2つのフィールドを変更できます。
| awk '{swap=$1;$1=$2;$2=swap;print $0}'