Shell-Script

使用循環和 awk 查找每列中的最高字元長度

  • July 15, 2020

我正在嘗試創建一個遍歷文件並在列中找到最高字元長度並將其返回的腳本。此腳本返回 78,78,78,78 時,我的目標是 10,11,14,51

for ((i=1;i<=4;i++)); do
 awk -F"|" '{ print length($i) }' contact_d.csv | sort -nr | sed '1!d';
done

contact_d.csv包含這個:(請注意虛擬數據)及其樣本

Barrera|Wilkinson|(09) 1466 1886|eu@dignissim.co.uk
Hopkins|Sellers|(07) 3814 2364|faucibus.orci@libero.co.uk
Hunter|Calderon|(01) 3984 0139|Proin@Uttincidunt.ca

有沒有人知道為什麼 for 循環沒有返回我的目標?

以下程式碼應該可以工作:

awk -F'|' '{for (i=1;i<=NF;i++) {len=length($i); if (len>lval[i]) {lval[i]=len; lpos[i]=FNR;}}} END{for (i in lval) printf("Longest value of column %d: %d (line %d)\n",i,lval[i],lpos[i])}' contact_d.csv

對於上面的例子,它返回

Longest value of column 1: 7 (line 1)
Longest value of column 2: 9 (line 1)
Longest value of column 3: 14 (line 1)
Longest value of column 4: 26 (line 2)
  • 該腳本將針對每一行循環遍歷所有欄位(從 1 到NF,欄位數)並查看欄位的長度(臨時儲存在變數中l)是否大於迄今為止發現的最長長度,該長度儲存在在lval欄位(=列)編號的索引下的數組變數中。
  • 在第一行,lval還沒有初始化,它會表現得好像所有lval[i]都是 0(實際上,它比這更複雜)。
  • 如果i目前行的欄位長度比 中儲存的值長lval[i],腳本會將欄位的目前長度lval[i]和目前行號(可通過“自動”變數訪問FNR)儲存到數組變數lpos中。
  • 在文件末尾(END條件),它將列印所有列的最長長度和對應位置。我使用for (i in lval)循環遍歷數組中存在的所有索引lval的構造,因此我不必將列數保存在一個額外的變數中(這對於塊中的“欄位數”的概念是必要for (i=1;i<=ncols;i++)的*) “變得有些不明確,儘管實際上**在訪問時通常會使用文件最後一行的相應值*)。END``awk

請注意,很少需要awk在 shell 循環中呼叫;它可以做大部分你需要一個循環的事情。

至於您最初嘗試失敗的原因,您試圖將$ishellawk變數 (如果沒有,它就不會那樣工作)。

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