linux - 如何将下两行打印到当前行?

时间:2016-12-12 14:15:42

标签: linux shell awk

我想在“* Apple”专栏上打印下两行。

$cat file.txt   
*Apple   
1234  
abcd  
*Apple  
4567  
dcba  
*Apple  
6789  
qwer  
*Apple  
6890  
rewq

期望的输出:

*Apple 1234 abcd   
*Apple 4567 dcba  
*Apple 6789 qwer   
*Apple 6890 rewq

我想用awk解决方案。

2 个答案:

答案 0 :(得分:1)

awk -vt=-1  '
/^\*Apple\s*$/ { if (t > -1) print ""; t = 2; printf("%s", $0); next }
t > 0          { t--; printf(" %s", $0) }
' file

输入

*Apple
111
222
aaa
*Apple
333
*Apple
*Apple
444

输出

*Apple 111 222
*Apple 333
*Apple
*Apple 444

注意,\sgawk-specific。对于其他AWK实现,请改用[[:space:]]

答案 1 :(得分:0)

问题没有明确说明(你只想要两行,还是只是你的特定例子在每次出现目标字符串后只有两行?),但这可能会让你开始:

awk '/^\*Apple$/{print "\n"}1; END{print "\n"}' ORS=' ' input

这个只打印2行,但会在大多数行的开头产生虚假空间:

awk '/^\*Apple$/{c=3}c;  c--==1 {print "\n"}' ORS=' ' input

你可以通过以下方式失去领先空间:

awk '/^\*Apple$/{c=3} c {printf "%s%c", $0, c--==1 ? "\n":" "}' input