awkを実行するときにファイルの文字列を値として扱うには?

awkを実行するときにファイルの文字列を値として扱うには?

文書一部の欠落データポイントの値があり、欠落している値はと表示されます****。 10未満の値を持つ7つの連続した列を持つ行を選択する必要があります。私が走るときスクリプト****また、連続列に対応する行を提供します。

**** すべてをより高い値に置き換えることで、簡単に問題を解決できます。しかし、入力ファイルを変更したくありません。私のスクリプトが****数字(より大きい)として扱うように何かをしたいと思います10 i.e. str=****=100。どうすればいいですか?

入力例consecutive7pointDown10.input-

2     3    4    5    6    7    8   0  12   14   23
2     3    4    12   6    7    8   0  1     2   23
**** **** **** **** **** **** **** 8 ****  **** 12

私のスクリプトの結果consecutive7pointDown10.output-

2     3    4    5    6    7    8    0    12    14   23
**** **** **** **** **** **** ****  8   ****  ****  12

ただし、予想出力

2     3    4    5    6    7    8    0    12  14   23

私のスクリプトconsecutive7pointDown10は次のとおりです -

#!/bin/bash
########################################################################################################################
# This script results rows having at most 10°C in consecutive at most 7 points.
# input = scriptname.input
# output = scriptname.output
########################################################################################################################
input=`basename "$0"`.input
output=`basename "$0"`.output
awk '{
    for(i=4;i<=34-6;i++)
        {   
            if($i<=10 && $(i+1)<=10 && $(i+2)<=10 && $(i+3)<=10 && $(i+4)<=10 && $(i+5)<=10 && $(i+6)<=10)
            {
                print
                next
            }
        }
}' $input > $output

ベストアンサー1

awk '/(\<[0-9]\s+){7}/{print}' input.txt

または

sed -rn '/(\b[0-9]\s{1,}){7}/p' input.txt

仕事をします。

awkの説明(sedのロジックは同じ):

  • /(\<[0-9]\s+){7}/{print}- パターンを含む行を印刷します。

  • \<- 単語の境界と一致します。つまり、右側の文字が「単語」文字で、左側の文字が「非単語」文字の場合は一致します。

  • [0-9]\s+0- に1桁の数字9、その後に1つ以上のスペースが続きます。
  • (\<[0-9]\s+){7}-\<[0-9]\s+パターンが7回繰り返されると一致します。

入力する

2     3    4    5    6    7    8   0  12   14   23
2     3    4    12   6    7    8   0  1     2   23
**** **** **** **** **** **** **** 8 ****  **** 12

出力

2     3    4    5    6    7    8   0  12   14   23

編集する:

精度が1の浮動小数点数(9.2、8.1、7.5など)の場合。

awk '/(\<[0-9]\.[0-9](\s+|$)){7}/{print}' input.txt

おすすめ記事