有沒有辦法使用 awk 計算檔案第一列中的記錄數?
我的檔案:-
abc|87123
cdb|
fgytw|23321
ghft|
|87635
預期輸出:4
我嘗試了以下命令,但它不起作用:
awk -F'|' 'NF==$1{c }END {print c}' file
uj5u.com熱心網友回復:
您可以使用
awk -F\| 'length($1){c } END{print c}'
查看在線演示:
#!/bin/bash
s='abc|87123
cdb|
fgytw|23321
ghft|
|87635'
awk -F\| 'length($1){c } END{print c}' <<< "$s"
# => 4
也就是說,c僅當欄位 1 長度大于零時才增加。
uj5u.com熱心網友回復:
$ awk -F'|' '$1 != ""{c } END{print c 0}' file
4
當沒有行與條件匹配時,您需要 0在末尾獲得數字輸出而不是空行。0
uj5u.com熱心網友回復:
第一種解決方案:使用您顯示的示例,請嘗試以下awk代碼。簡單的解釋是,這將檢查第一個欄位是否為空(不是空格)并且具有長度,然后計算該欄位并繼續為整個 Input_file 執行此操作,然后在END塊中awk列印找到的匹配總數。
awk -F'|' '$1!~/[[:space:]]/ && length($1){count } END{print count}' Input_file
注意:如果您在第一列中也可能有空格或制表符,也可以從 更改為[[:space:]]。[[:blank:]]
第二種解決方案:在此解決方案中使用 GNUgrep wc組合。
grep -oP '^\S \|' Input_file | wc -l
第三種解決方案:根據 RARE kpoop Manifesto 評論中的建議,也可以嘗試遵循。
awk -F'^[[:space:]]*[|]' '{ count = NF == 1 } END { print count}' Input_file
uj5u.com熱心網友回復:
那這個呢:
echo $(( $(cat test.txt | wc -l) - $(grep "^|" test.txt | wc -l) ))
為了讓您了解它的含義:
cat test.txt | wc -l
這會計算整個檔案中的行數。不要使用wc -l test.txt,因為這也會輸出您不需要的檔案名。
grep "^|" test.txt | wc -l
這是一個巧妙的技巧:^意思是“線的開始”。當它后跟一個列分隔符時,則表示第一列未填寫。因此,grep "^|" test.txt | wc -l給出第一列未填寫的行數。
現在,如何將兩者結合起來?好吧,只需使用$((4-1)),它執行整數計算。
我承認,它看起來很糟糕,但它確實有效!:-)
uj5u.com熱心網友回復:
另一種awk解決方案:
awk '/^[^|]/{ c} END {print c}' file
4
uj5u.com熱心網友回復:
$ wc -l < <(sed '/^|/d' file)
4
$ sed '/^|/d' file|sed -n '$='
4
$ grep -c "^[^|]" file
4
uj5u.com熱心網友回復:
保持簡單 - 3 種表達方式:
{m,g}awk '{ _ = NF } END { print NR-_ NR }' FS='^[|]'
{m,g}awk '{ _ =!__~NF } END { print _ }' FS='^[|]'
{m,g}awk '{ _ =/^\|/ } END { print NR-_ }' FS='^$'
4
如果您不介意一次加載所有檔案,那么更容易:
- single subtraction gsub()
- no tracking needed
- input rows become "fields" in this context
.
{m,g}awk '$!NF = NF - gsub("(^|\n)[|]|\n$","&")' FS='\n' RS='^$'
4
或者,如果您想顛倒順序(誠然,任務過大):。
{m,g}awk '$!NF= gsub("[^|] ","&", $!(NF = NF))' RS='^$' \
OFS='|' FS='[|]([^|\n]*[|])*[^|\n]*\n' OFS='|'
4
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/492671.html
