簡體   English   中英

如果列為空,則awk打印

[英]awk print something if column is empty

我正在嘗試一個腳本,其中文件[file.txt]具有如此多的列,例如

abc|pqr|lmn|123
pqr|xzy|321|azy
lee|cha| |325
xyz| |abc|123

我想使用awk命令在bash腳本中獲取列列表,如果列為空,則應打印為空白,否則打印列值

我已經嘗試了以下可能性,但是它不起作用

cat file.txt | awk -F "|" {'print $2'} | sed -e 's/^$/blank/' // Using awk and sed
cat file.txt | awk -F "|" '!$2 {print "blank"} '
cat file.txt | awk -F "|" '{if  ($2 =="" ) print "blank" } '

請讓我知道我們如何使用awk或任何其他bash工具來做到這一點。

謝謝

您可以使用以下sed腳本執行此操作:

sed -r 's/\| +\|/\|blank\|/g' File
abc|pqr|lmn|123
pqr|xzy|321|azy
lee|cha|blank|325
xyz|blank|abc|123

如果您不想要|

sed -r 's/\| +\|/\|blank\|/g; s/\|/ /g' File
abc pqr lmn 123
pqr xzy 321 azy
lee cha blank 325
xyz blank abc 123

其他與awk

awk '{gsub(/\| +\|/,"|blank|")}1' File
abc|pqr|lmn|123
pqr|xzy|321|azy
lee|cha|blank|325
xyz|blank|abc|123

我想你要找的是

awk -F '|' '{print match($2, /[^ ]/) ? $2 : "blank"}' file.txt

match(str, regex)返回match(str, regex)的第一個匹配項在str中的位置;如果沒有匹配項match(str, regex)返回0。 因此,在這種情況下,如果字段2中有一些非空白字符,它將返回一個非零值。請注意,在awk中,字符串中第一個字符的索引為1,而不是0。

在這里,我假設您只對單個列感興趣。

如果您希望能夠從bash變量中指定替換字符串,最好的解決方案是使用-v開關將bash變量傳遞到awk程序中:

awk -F '|' -v blank="$replacement" \
    '{print match($2, /[^ ]/) ? $2 : blank}' file.txt

這種機制避免了轉義元字符的問題。

您可以這樣使用awk:

awk 'BEGIN{FS=OFS="|"} {for (i=1; i<=NF; i++) if ($i ~ /^ *$/) $i="blank"} 1' file
abc|pqr|lmn|123
pqr|xzy|321|azy
lee|cha|blank|325
xyz|blank|abc|123

暫無
暫無

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

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