【问题标题】:Print each line matching string followed by first line matching string打印每行匹配字符串,后跟第一行匹配字符串
【发布时间】:2016-06-13 00:13:59
【问题描述】:

我有这个:

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 可以做到这一点,但语法让我难以理解。我试图从其他或多或少相似的解决方案中推断,但没有成功。

【问题讨论】:

  • 您至少应该发布您尝试过的内容,因此看起来您至少尝试过。那些是 id 的真实样子吗?如果是这样,那么 awk 就不是必需的了——只需获取名称并在迭代时添加 id。
  • 只需丢弃/忽略所有idX。阅读所有name: * 并在它们前面加上一个正在运行的idX,其中X 从1 开始计数。
  • 我有一个答案,但请附上您迄今为止为解决此问题所做的尝试,以便我们也可以了解一下。
  • id 1,2,3...n 之后的数字是否严格按照这个顺序排列?是,只是将它们过滤掉。
  • @alvits:grepcat,最后是sed,你告诉我们这是lazy method。 ;)

标签: bash awk


【解决方案1】:

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

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

【讨论】:

  • @mklement0 谢谢!
  • 手感不错!!解决一个问题有多少种方法.. :-)
【解决方案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

【讨论】:

  • 只要id 标签是 1、2、3 等,但是是的 - 就是这样
  • 你可以写成awk '/name/{print "id"++c,$0}' your_file_name
  • @EdMorton 。谢谢,好多了,但我想对于说but the syntax eludes me 的操作来说,它的可读性会降低。
  • 他们必须在某个时候学习惯用的 awk 语法,恕我直言,最好立即学习它,尤其是当它只是小例子的时候,而不是先看看如何继续用惯用的 C 语言进行编程,然后再忘记它之后。虽然 nbd...
【解决方案3】:
$ awk '!/^name:/{id[++a]=$0;next} {print id[++b], $0}' file
id1 name: Chris
id2 name: John
id3 name: Mary
id4 name: Mike

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-17
    • 2016-08-26
    • 1970-01-01
    • 2018-04-09
    • 1970-01-01
    • 2020-06-16
    • 2022-06-15
    • 1970-01-01
    相关资源
    最近更新 更多