ファイルから特定の列を抽出したいと思います。列番号はシェルスクリプトを使用して他のファイルに提供されますか?

ファイルから特定の列を抽出したいと思います。列番号はシェルスクリプトを使用して他のファイルに提供されますか?

file1から抽出する必要がある列番号を提供するfile2と比較して、file1から特定の列を抽出したいと思います。

ファイル1(ソースデータ)は次のとおりです。

  1  2  3  4  5 10 11 14  
  13 25 37 2 4 7  9 23  
  12  12 23 15 17 18 24 25

ファイル2(抽出する列番号を含む):

  2  
  4  
  5

だからfile1とfile2を比較したいと思います。ファイル2を使用してファイル1から列番号2,4,5を抽出したいと思います。

希望の出力:

  2 4 5  
  25 2 4  
  12 15 17  

どうやって進めますか?

答え1

また試み

awk '
FNR == NR       {COL[NR] = $1                   # get column numbers from file2
                 MX = NR                        # retain max line No. in file2
                 next
                }
                {for (i=1; i<=MX; i++)  printf "%s%s", $(COL[i]), (i==MX)?ORS:OFS
                                                # print those columns, and field
                                                # or line separator
                }
' file2 file1
2 4 5
25 2 4
12 15 17

答え2

そしてPerl

perl -pale '$"="\t";
   chomp(@A = map { $_-1 } grep { /^[1-9]\d*$/m } <STDIN>) if $. == 1;
   $_ = @A ? "@F[@A]" : last;
' File1 < File2

結果:

2   4   5
25  2   4
12  15  17

説明する:

Perlユーティリティにstdinの列番号ファイル(1行に1つの列番号)を指定し、Perlコマンドラインにデータファイルを提供します。

配列要素コネクタの設定($")をaにTAB変更して、すべての出力フィールドをタブ区切りにします。

印刷する列の配列が空で@Aあることを検出したら、すぐにプログラムを終了してください。File2行ごとに正の整数を持つ行のみが含まれます。他の組み合わせは拒否されます。

関連情報