AWK 用于在文件中填充其余列

AWK 用于在文件中填充其余列

我正在尝试让 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}'

也许这并不完全适合这个问题,但它可能对许多用户有用。

相关内容