Linux

如何在 awk 中編寫腳本來告訴每條記錄中欄位的平均長度,而不計算空格?

  • November 5, 2019

所以我需要編寫一個 awk 腳本文件來查找並列印文本文件中每條記錄的平均欄位長度。文本文件是這樣的:

The quick brown fox jumped over the lazy dog's back.
The rain in Spain falls mainly on the plain.
The rain in Spain also falls on the mountains.

現在,我正在使用的是這個,在一個腳本文件中:

{average = length($0)/NF
  print "Average field length for record: " average}

通過做“長度( $ 0)," it counts everything in the record. I tried doing something like length( $ 1)+長度( $ 2)+length( $ 3)+等,但記錄有不同的長度,我無法解釋這一點,特別是因為這應該適用於任何長度的記錄。

我遇到的問題是它計算每個欄位之間的空格,我不想計算它。目前,我為每條記錄獲得的數字分別是 5.2、4.8 和 5.1。有沒有辦法不計算空格?

除此之外,我還需要在整個文件中找到平均欄位長度。同樣,我相信我的 awk 腳本也在計算空格,這是我不想要的。這是我的腳本文件:

BEGIN{
       sum = 0
    }
{
    sum += length()
    sum = sum/NF
}
END{
    print "Average field length in file: " sum
    }

我必須進行什麼修改才能不計算空格,而只計算字母和標點符號,基本上除了空格之外的所有內容?事實上,我得到的文本文件中所有欄位的平均值是 5.7,我認為這是不正確的。

您可以通過依賴預設欄位分隔符併計算欄位大小來跳過空格,如您所建議的,通過使用NF變數來考慮不同數量的欄位。

因此對於每條記錄的平均值:

NF > 0 {
   linesum = 0
   for (i = 1; i <= NF; i++) linesum += length($i)
   print "Average field length for record: " linesum / NF
}

對於整個文件:

{
   for (i = 1; i <= NF; i++) sum += length($i)
   count += NF
}

END { if (count > 0) { print "Average field length in file: " (sum / count) } }

這也解決了逐行計算平均值的問題。

以您的範例為例,這給出了平均 4.17857(計算標點符號)。

引用自:https://unix.stackexchange.com/questions/550514