2番目のファイルの情報に基づいてファイルの特定の列をどのように削除しますか?

2番目のファイルの情報に基づいてファイルの特定の列をどのように削除しますか?

次の 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

関連情報