如果列为空,awk打印一些东西

pra*_*bhu 1 bash awk sed

我正在尝试一个脚本,其中文件[file.txt]有如此多的列

abc|pqr|lmn|123
pqr|xzy|321|azy
lee|cha| |325
xyz| |abc|123
Run Code Online (Sandbox Code Playgroud)

我想用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" } '
Run Code Online (Sandbox Code Playgroud)

请让我知道如何使用awk或任何其他bash工具来做到这一点.

谢谢

Arj*_*Dan 5

您可以使用此sed脚本执行此操作:

sed -r 's/\| +\|/\|blank\|/g' File
abc|pqr|lmn|123
pqr|xzy|321|azy
lee|cha|blank|325
xyz|blank|abc|123
Run Code Online (Sandbox Code Playgroud)

如果你不想要|:

sed -r 's/\| +\|/\|blank\|/g; s/\|/ /g' File
abc pqr lmn 123
pqr xzy 321 azy
lee cha blank 325
xyz blank abc 123
Run Code Online (Sandbox Code Playgroud)

其他awk:

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


ric*_*ici 5

我想你要找的是

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

match(str, regex)返回str正则表达式第一个匹配项的位置,如果没有匹配项,则返回0。所以在这种情况下,如果字段 2 中有一些非空白字符,它将返回一个非零值。 注意在 awk 中,字符串中第一个字符的索引是 1,而不是 0。

在这里,我假设您只对单个列感兴趣。

如果您希望能够从 bash 变量中指定替换字符串,最好的解决方案是使用-vswitch将 bash 变量传递给 awk 程序:

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

这种机制避免了转义元字符的问题。