Bash - 在列中填充具有以下值的空单元格

时间:2014-07-15 14:54:30

标签: bash csv awk

我有一个很长的制表符分隔的CSV文件,我试图在单元格中粘贴稍后列的值。 例如,input.txt:

0 
1 
1.345 B
2
2.86 A
3
4

我想输出如下:

0 B
1 B
1.345 B
2 A
2.86 A
3 B
4 B

我一直在修补其他线程中的代码,例如this awk solution,但问题是我想要的值不是在空单元格之前,而是之后,Excel中的.FillUp类型。

其他信息:

  • 输入文件可能有不同的行数
  • 输入文件中的“A”和“B”可能位于不同的行且不均匀分开
  • 第二列可能只有两个值
  • 第二列中的最后一个单元格可能没有值
  • [EDIT]对于input.txt中的最后两行,已知B位于第二列,因为2.86之后的所有行都不是A.

提前致谢。

2 个答案:

答案 0 :(得分:4)

$ tac input.txt | awk -v V=B '{if ($2) V=$2; else $2=V; print}' | tac
0 B
1 B
1.345 B
2 A
2.86 A
3 B
4 B

taccat向后)反向打印文件。反转文件,填写缺失的值,然后再将其反转。

答案 1 :(得分:0)

只要您知道要填充的第一个值,就可以一次处理文件。它应该比反转文件快两倍。

awk 'BEGIN {fillvalue="B"} $2 {fillvalue=$2=="A"?"B":"A"} !$2 {$2=fillvalue} 1' input.txt

请注意,这假设知道第二列的性质仅仅是' A'或者' B'或空白。