我正在尝试让 AWK 填充以下文本文件中的“空”列”。
使用 AWK NF 查找最长行并检查哪一行在该列上没有值的基本思想。然后为每个空列添加 x 次 N/A。
此示例是输入空格分隔的,但当然可以轻松更改为任何字符分隔的文件。
输入可以是:
aaa bbb ccc ddd
aaa
aaa bbb ccc
hhh ppp uuu
www yyy hhh
hhh 111 333 yyy ooo hyy uuuioooy
并输出计算文件中最大列的数量并将 N/A 添加到空列。
aaa bbb ccc ddd N/A N/A N/A
aaa N/A N/A N/A N/A N/A N/A
aaa bbb ccc N/A N/A N/A N/A
hhh ppp uuu N/A N/A N/A N/A
www yyy hhh N/A N/A N/A N/A
hhh 111 333 yyy ooo hyy uuuioooy
答案1
最简单的方法是分两步完成,首先找到最宽的线:
max=$(awk 'max < NF { max = NF } END { print max }' infile)
然后在填写其他列时使用它作为输入:
awk -v max=$max '{ for(i=NF+1; i<=max; i++) $i = "N/A"; print }' infile
答案2
awk 'FNR==NR{if(m<NF)m=NF;next}{for(i=NF;i<m;i++)$(i+1)="N/A"}1' tiny.txt tiny.txt
请注意指定了两次的输入文件名。
答案3
如果您的文件包含所有列的字段分隔符也在缺少字段的行中,那么还有另一个很好的解决方案,它也可以处理缺少字段位于行内而不仅仅是在行尾的情况。例如任何带有空单元格的电子表格(如果使用正确的分隔符)。
例如。对于空格分隔的文件
aaa bbb ccc ddd ggg
aaa abb ccc
www yyy hhh
www yyy 333 yyy ooo hyy
您可以使用
awk -F'[ ]' '{OFS=" ";for(i=1;i<=NF;i++){if($i==""){$i="N/A"}};print}' infile.txt
或者对于制表符分隔:
awk -F'\t' '{OFS="\t";for(i=1;i<=NF;i++){if($i==""){$i="N/A"}};print}' infile.txt
小心 DOS/Windows 生成的文件,例如。从 Excel 中,您需要删除回车符:
cat infile.txt | tr -d '\r' | awk -F'[ ]' '{OFS=" ";for(i=1;i<=NF;i++){if($i==""){$i="N/A"}};print}'
也许这并不完全适合这个问题,但它可能对许多用户有用。