次の 2 つのファイルがあります。
file1:
1 235 283 567 1001 1002 1009
1 1 2 1 2 0 1
0 0 0 0 0 2 2
1 2 2 2 2 2 2
そして
file2:
1 567 1002 1009
これらのファイルを垂直にリンクしたいです。つまり、出力には、file1
最初の行の値が次の列のみを含む必要がありますfile2
。
出力:
1 567 1002 1009
1 1 0 1
0 0 2 2
1 2 2 2
どんな提案がありますか?
答え1
そしてawk
:
awk '
NR==FNR{for(i=1;i<=NF;i++){values[$i]};next}
FNR==1{for(i=1;i<=NF;i++){if ($i in values){nf[i]}}}
{sp=""; for(i=1;i<=NF;i++){if (i in nf){printf("%s%s",sp,$i);sp=" "}}}{print ""}
' file2 file1
まず読み込み、file2
各値を配列に保存してvalues
処理しますfile1
。最初の行で、どのフィールドが公開されているかを確認し、そのフィールド番号を別の配列に保存して参照としてnf
使用します。オプションで、対応する列を印刷します。
答え2
オンラインユーザーがタスクを実行する場合:
cut -d' ' -f $(
echo $(
head -1 file1 | tr ' ' '\n' |
grep -nxf <(tr ' ' '\n' <file2) |
cut -d: -f1
) |
tr ' ' ','
) file1
またはトルのコメント
cut -d' ' -f $(
head -1 file1 | tr ' ' '\n' |
grep -nxf <(tr ' ' '\n' <file2) |
cut -d: -f1 |
paste -sd ,
) file1