打印每行匹配字符串,然后打印第一行匹配字符串

时间:2016-05-27 01:39:10

标签: bash awk

我有这个:

id1
name: Chris
id2
id3
name: John
name: Mary
id4
name: Mike

我需要重新安排至少这样:

id1
name: Chris
id2
name: John
id3
name: Mary
id4
name: Mike

但理想情况是这样的:

id1 name: Chris
id2 name: John
id3 name: Mary
id4 name: Mike

我知道这可以通过awk实现,但语法不适用于我。我尝试从其他或多或少类似的解决方案中推断但没有成功。

3 个答案:

答案 0 :(得分:3)

替代awk:此解决方案paste的两个进程替换。第一个进程返回以id开头的所有行,第二个进程返回所有其他行。列由空格分隔(-d ' '选项)。

$ paste -d ' ' <(grep '^id' infile) <(grep -v '^id' infile)
id1 name: Chris
id2 name: John
id3 name: Mary
id4 name: Mike

答案 1 :(得分:2)

awk 'BEGIN{
count=0
}
/name/{
count++;printf "id%d %s\n",count,$0
}' your_file_name

应该这样做。

<强>输出

id1 name: Chris
id2 name: John
id3 name: Mary
id4 name: Mike

现在优雅的单行(感谢@ ed-morton)

awk '/name/{print "id"++c,$0}' your_file_name

答案 2 :(得分:1)

$ awk '!/^name:/{id[++a]=$0;next} {print id[++b], $0}' file
id1 name: Chris
id2 name: John
id3 name: Mary
id4 name: Mike