次のように3x66行列に配列されたテキストファイルがありますmat.txt
。
0 -1 0.000532 -0.00026 0.000465 etc...
0 0.000294 1 -0.000102 -0.1146 etc...
0 -0.000134 0.0000967 1 -0.9972 etc...
これらの値は、3D座標のペアとして見ることができます。ここで、各行の最初の値は(x、y、z)座標を表し、各行の2番目の値は異なる(x、y、z)座標を表します。 。先頭のゼロに加えて、数字はファイルごとに異なるため、文字列ではなくテキストファイルの場所に基づいて場所を指定する必要があります。
ファイルから特定の座標を削除する必要がありますが、座標はファイルによって異なります。列全体を分離して削除するために使用できると思いましたが、awk
削除する列をどのように動的に読み取るのかわかりません。削除する列を含む別のテキストファイルがあります。
たとえば、
cat delete.txt
2 5 18 27 59
awkを使用して列2、5、18などを分離して削除できますか?
for i in $(cat delete.txt)
do
awk '{print $i}' | rm $i << mat.txt
done
ベストアンサー1
次の場合infile
:
0 -1 0.000532 -0.00026 0.000465 etc...
0 0.000294 1 -0.000102 -0.1146 etc...
0 -0.000134 0.0000967 1 -0.9972 etc...
delete
[OK]から削除したい列番号は次のとおりですinfile
。
2 4 6
を使用すると、awk
次のことができます。
awk 'NR==FNR { split($0, to_delete); next }
# split 'delete' file into an array called to_delete on default FS (white-space)
{ for (col in to_delete) $to_delete[col]=""; print }' delete infile
# delete the columns from 'infile' that match with $column getting from array
これにより、ファイルから列2、4、6が削除された出力が提供されます。
0 0.000532 0.000465
0 1 -0.1146
0 0.0000967 -0.9972