簡體   English   中英

在awk中設置一個外部變量

[英]Set an external variable in awk

我編寫了一個腳本,希望在其中計算data.txt中的列數。 我的問題是我無法在awk腳本中設置x。 任何幫助將不勝感激。

while read p; do
  x=1;
  echo $p | awk -F' ' '{x=NF}'
  echo $x;
  file="$x"".txt";
  echo $file;
  done <$1

data.txt文件:

4495125 94307025    giovy115p@live.it   94307025.094307025  12443
stazla  deva1a23@gmail.com  1992/.:\1
1447585 gioao_87@hotmail.it h1st@1
saknit  tomboro@seznam.cz   1233    1990

預期產量:

5.txt
3.txt
3.txt
4.txt

我的輸出:

1.txt
1.txt
1.txt
1.txt

您只是無法Awk設置的變量導入到外殼上下文中。 在您的示例中,包含NF x內設置的值不會在外部反映出來。

您需要使用命令替換( $(..) )語法來獲取NF的值並在以后使用

x=$(echo "$p" | awk '{print NF}')

現在x將在每一行中包含列數。 請注意,您不需要使用-F' ' ,它是awk的默認awk

此外,您的要求可以完全在Awk完成。

awk 'NF{print NF".txt"}' file

此處的NF{..}是為了確保{..}內部的操作僅應用於非空行。 對於每行,我們將打印長度,並在.txt附加擴展名.txt

Awk一次處理一行-在shell內的單獨Awk腳本中處理每一行, while read循環效率極低。 另請參閱https://unix.stackexchange.com/questions/169716/why-is-using-a-shell-loop-to-process-text-considered-bad-practice

也許是這樣的:

awk '{ print >(NF ".txt") }' data.txt

創建一個文件,其中每個唯一的列數在5.txt包含五列,在4.txt包含四列,在2.txt包含三列, 2.txt

Awk變量NF包含字段數(默認情況下,Awk在空白行上拆分字段-使用-F更改為其他分隔符),表達式(NF ".txt")僅生成該數字的字符串分類后綴.txt的字段(我們將其作為文件名傳遞給print重定向)。

用bash:

while read p; do p=($p); echo "${#p[@]}.txt"; done < file

或更短:

while read -a p; do echo "${#p[@]}.txt"; done < file

輸出:

5.txt
3.txt
3.txt
4.txt

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM