如何在Unix中填充字段

时间:2014-08-19 07:56:57

标签: unix awk grep formatting awk-formatting

我有两个文件的文件如下所示,我需要根据输出中一行中的第一个值填充字段1中的值。

INPUT:

USA 3Q  2013
    4Q  2013
    1Q  2014
    2Q  2014
    3Q  2014
    4Q  2014
    1Q  2015
    2Q  2015
    3Q  2015
BRAZIL  3Q  2013
    4Q  2013
    1Q  2014
    2Q  2014
    3Q  2014
    4Q  2014
    1Q  2015
    2Q  2015
    3Q  2015

输出:

USA 3Q  2013
USA 4Q  2013
USA 1Q  2014
USA 2Q  2014
USA 3Q  2014
USA 4Q  2014
USA 1Q  2015
USA 2Q  2015
USA 3Q  2015
BRAZIL  3Q  2013
BRAZIL  4Q  2013
BRAZIL  1Q  2014
BRAZIL  2Q  2014
BRAZIL  3Q  2014
BRAZIL  4Q  2014
BRAZIL  1Q  2015
BRAZIL  2Q  2015
BRAZIL  3Q  2015

3 个答案:

答案 0 :(得分:2)

另一种方式

awk -v OFS="\t" 'NF!=3{$0=x$0}{x=$1=$1}1' file

答案 1 :(得分:1)

例如,你可以使用它:

$ awk 'NF==3 {a=$1; print; next} {print a, $0}' file | column -t
USA     3Q  2013
USA     4Q  2013
USA     1Q  2014
USA     2Q  2014
USA     3Q  2014
USA     4Q  2014
USA     1Q  2015
USA     2Q  2015
USA     3Q  2015
BRAZIL  3Q  2013
BRAZIL  4Q  2013
BRAZIL  1Q  2014
BRAZIL  2Q  2014
BRAZIL  3Q  2014
BRAZIL  4Q  2014
BRAZIL  1Q  2015
BRAZIL  2Q  2015
BRAZIL  3Q  2015

它捕获第一个字段,以防有3个字段。然后,它将它与线的其余部分一起使用。

最后,column -t格式化以制表符分隔的列

中的输出

答案 2 :(得分:1)

awk 'NF<3{$0=k $0} {k=$1} 1' file

或者如果您关心使用GNU awk为gensub()保留空格:

$ awk '{sub(/^[[:space:]]+/,k); k=gensub(/([^[:space:]]+[[:space:]]+).*/,"\\1","")} 1' file
USA 3Q  2013
USA 4Q  2013
USA 1Q  2014
USA 2Q  2014
USA 3Q  2014
USA 4Q  2014
USA 1Q  2015
USA 2Q  2015
USA 3Q  2015
BRAZIL  3Q  2013
BRAZIL  4Q  2013
BRAZIL  1Q  2014
BRAZIL  2Q  2014
BRAZIL  3Q  2014
BRAZIL  4Q  2014
BRAZIL  1Q  2015
BRAZIL  2Q  2015
BRAZIL  3Q  2015

其他问题包括:

$ awk '{sub(/^[[:space:]]+/,k); match($0,/[^[:space:]]+[[:space:]]+/); k=substr($0,1,RLENGTH)} 1' file