与えられたデータから最大の正数を探しますか?

与えられたデータから最大の正数を探しますか?

誰かがawk、sed、またはいくつかのUnixシェルプログラムを使用して最大の正数を見つける方法を教えてください。私はLinux RHELとKSHを使用しています。入力には8つのデータ列があり、N / Aは可能な値の1つです。

SAMPLE INPUT

1252.2          1251.8          N/A             N/A 
-31.9           -33.2           N/A             N/A 
-1172.4         -1174.4         N/A             N/A 
-6.5            -6.4            N/A             N/A 
-.3             -.3             N/A             N/A 
1351.8          1351.8          N/A             N/A 
38.3            38.0            N/A             N/A 
-21.6           -21.9           N/A             N/A 
-4.7            -4.5            N/A             N/A 
-5.0            -2.9            N/A             N/A 
3.1             3.3             N/A             N/A 
-20.1           -20.3           N/A             N/A 
-199.1          -199.3          N/A             N/A 
346.5           346.7           N/A             N/A 
-.8             -.4             N/A             N/A 
14.8            14.7            N/A             N/A 
8.4             8.4             N/A             N/A 
-18.2           -18.2           N/A             N/A 
-43.7           -43.6           N/A             N/A 

希望の出力

Largest number is 1351.8

答え1

Awk を使用してN/A項目の数値計算を強制します。

awk '{for (i=1;i<=NF;i++) max = $i+0 > max ? $i : max} END{print "Largest number is " max}' data

答え2

1つのアプローチは次のとおりです。

perl -lane '$_>$m and $m=$_ for @F}{print $m' sample.txt

説明する:

  1. -nオプションは入力ファイルを1行ずつ処理します。

  2. -eオプションは、入力読み取りの各行に応じてPerlコードを適用します。

  3. -aオプションは、個々のフィールドを読み取るときに各行を分割して配列に保存します@F

  4. -lオプションはRS = ORS = "\ n"を作成します。

  5. for @F各フィールドは現在のフィールドがに保存されて繰り返されます$_

  6. 現在のフィールドを最大値と比較して最大値を超えると、最大値が更新されます。

  7. 比較が終わったら、}{maxの内容を印刷します。

  8. 数値コンテキストでは、sはN/Aゼロとして扱われる必要があるため、最初からすべての数値が負でない限り、結果には影響しません。

答え3

tr、およびを使用したsortbashスタイルのソリューションhead

echo $(< file) | tr ' ' '\n' | sort -rn | head -1
  • echo $(< file)ファイルを読み、結果をエコーし​​ます。ただし、周囲に引用符を入れなかったため(echo "$(< file)"と同じcat file)、内容は改行文字が削除され、スペースが圧縮された長い文字列です。
  • | tr ' ' '\n'tr各空白文字を改行文字に置き換えて結果を渡します。
  • | sort -rn結果を にパイプし、sortすべての行を逆順(-r)数字(-n)順(最も大きい数字から)にソートします。
  • | head -1結果をhead出力の最初の行にパイプします。

答え4

次のメソッドコマンドで実行しました。

awk '{print $0}' o.txt | sed -r "s/\s+/\n/g"| sed '/^$/d'| sort | uniq| sed -n '/[0-9]/p'| awk 'BEGIN{sum=0;m=" "}($1 >sum){sum=$1}{m=sum}END{print m}'

出力

 awk '{print $0}' o.txt | sed -r "s/\s+/\n/g"| sed '/^$/d'| sort | uniq| sed -n '/[0-9]/p'| awk 'BEGIN{sum=0;m=" "}($1 >sum){sum=$1}{m=sum}END{print m}' 

出力

1351.8

関連情報