web-dev-qa-db-ja.com

ファイルから特定の列を抽出したいのですが、列番号はシェルスクリプトを使用して別のファイルで指定されていますか?

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を使用して、file1から列番号2、4、5を抽出します。

必要な出力:

  2 4 5  
  25 2 4  
  12 15 17  

どうすればそのために進めることができますか?

2
claudia smith

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

説明:

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

配列要素の連結子($")をTABに設定して、すべての出力フィールドがTABで区切られるようにします。

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

1
Rakesh Sharma

また試してみてください

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
3
RudiC