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
どうすればそのために進めることができますか?
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
の行のみで構成されます。その他の組み合わせは拒否されます。
また試してみてください
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