Linux
如何在 awk 中編寫腳本來告訴每條記錄中欄位的平均長度,而不計算空格?
所以我需要編寫一個 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(計算標點符號)。