0

行ごとに異なる数の列が混在するテキスト ファイルがあります。

その行の列3、4、および5に数字のみが含まれている場合にのみ、行を印刷したい。

トリックは、列3、4、および5に特殊文字「(」または「)」が埋め込まれている場合があり、これらの数値も印刷したいです。

cat $filename | awk '{ if ( ($3 != "^[0-9]") && ($4 != "^[0-9]") && ($5 != "^[0-9]") ) print $2, $3, $4, $5 }' >>text.dat

ただし、Au2、Cu2 なども印刷されます。

助言がありますか?

アップデート:

入力テキスト ファイルの関連部分は次のようになります。

Cu1 Cu 0.00000 0.094635(14) 0.094635(14)
Cu2 Cu 0.00000 0.125943(15) 0.125943(15)
.
.
.

私が欲しいのは次のとおりです。

Cu 0.00000 0.094635 0.094635
Cu 0.00000 0.125943 0.125943
.
.
.

「Cu」は元の入力ファイルの 2 列目の文字列からのものであり、4 列目と 5 列目の数字と括弧を削除したことに注意してください。また、3 列目にも括弧が存在する可能性があることに注意してください。括弧内の数字は 1 桁の場合があります。

4

1 に答える 1

1

あなたのコードで:

 ($3 != "^[0-9]") && ($4 != "^[0-9]") && ($5 != "^[0-9]") 

!=not equal to正規表現の一致テストを行わないことを意味します。

試してみる$3~/[0-9]+/ && $4~/[0-9]+/など

(または問題の)場合、$2 $3 $4 で正規表現の一致を確認する前に( or )、それらのフィールドをすべて に置き換えて""から、一致テストを行います。

上記の説明が十分に明確であることを願っています。

編集

awk '{for(i=3;i<=5;i++)gsub(/\([^\)]*\)/,"",$i)}$3~/[0-9\.]*/&&$4~/[0-9\.]*/&&$5~/[0-9\.]*/' file

上記の行は次のことを行います。

  • $3、$4、$5 から (...) を削除
  • $3、$4、$5 が数値 (または 10 進数) かどうかを確認します。
  • はいの場合は、ラインアウトを印刷します

あなたの例で:

kent$  echo "Cu1 Cu 0.00000 0.094635(14) 0.094635(14)
Cu2 Cu 0.00000 0.125943(15) 0.125943(15)"|awk '{for(i=3;i<=5;i++)gsub(/\([^\)]*\)/,"",$i)}$3~/[0-9\.]*/&&$4~/[0-9\.]*/&&$5~/[0-9\.]*/'                                               
Cu1 Cu 0.00000 0.094635 0.094635
Cu2 Cu 0.00000 0.125943 0.125943

$2、$3、$4、$5 のみ:

awk '{for(i=3;i<=5;i++)gsub(/\([^\)]*\)/,"",$i);if($3~/[0-9\.]*/&&$4~/[0-9\.]*/&&$5~/[0-9\.]*/)print $2,$3,$4,$5}' file
于 2013-01-15T00:27:55.177 に答える