如何用命令行将文本每两行合并为一行?

5 篇文章 0 订阅
文章讲述了如何使用awk和sed工具分别处理一个文本文件,将每行的键和值合并到同一行,且在它们之间添加分隔符。awk命令适用于奇偶行处理,而sed则通过N和s命令实现行间合并。
摘要由CSDN通过智能技术生成

问题

我有一个文本文件,其格式如下:第一行为 KEY,第二行为 VALUE

KEY 4048:1736 string
3
KEY 0:1772 string
1
KEY 4192:1349 string
1
KEY 7329:2407 string
2
KEY 0:1774 string
1

我需要将值与对应的键置于同一行。因此,输出应如下所示:

KEY 4048:1736 string 3
KEY 0:1772 string 1
KEY 4192:1349 string 1
KEY 7329:2407 string 2
KEY 0:1774 string 1

若能在键值之间使用某种分隔符,如 $,,那就更好了:

KEY 4048:1736 string, 3

如何把两行合并成一行?


回答

使用 awk 命令

awk 'NR%2{printf "%s, ",$0;next;}1' yourFile

是一个使用awk工具对名为yourFile的文件进行操作的命令。下面对该命令进行详细解释:

  1. awk:这是一个强大的文本处理工具,它逐行读取输入文件(此处为yourFile),根据提供的模式和动作对每一行进行处理。

  2. '{...}':这是awk命令中的脚本块,其中包含了一系列针对每一行的模式(条件)和动作(命令)。在这行命令中,脚本块内有两个部分,由;分隔。

  3. NR%2:这里的NRawk内置变量,表示当前处理的行号(Number of Record)。NR%2计算NR除以2的余数。如果余数为非零(即奇数行),表达式求值为真(True)。

  4. printf "%s, ", $0;:如果NR%2为真(即当前行是奇数行),执行以下动作:

    • printf函数用于格式化输出字符串。%s是格式占位符,表示要打印的字符串;$0代表当前行的完整文本内容。
    • , 是紧跟在%s后面的字符串,表示在输出的行内容之后添加逗号和空格作为分隔符。
    • 整个printf语句的作用是打印当前行的内容($0),并在其后附加一个逗号和空格。
  5. next:紧跟在printf之后的next关键字指示awk跳过后续的所有动作,直接开始处理下一行。这意味着在奇数行上执行完printf后,不会继续执行后面的1(默认动作),而是直接转到下一行。

  6. 1:在awk中,任何非零数值(如1)都表示真(True),可以视为一个简化的模式,表示“对于所有行”。当没有指定具体的模式时,这个1就相当于一个默认的动作,即打印当前行($0)。这里由于前面有next,所以只有偶数行才会执行到这个1,直接打印该行内容。

综上所述,此awk命令的作用是:

  • 对于yourFile中的奇数行(NR%2为真),将其内容输出并追加一个逗号和空格;
  • 跳过执行后续的默认打印动作(next);
  • 对于偶数行,由于没有执行 printf, awk 会执行默认的动作,即 print $0,输出当前行的内容(包括换行符)。
  • 这个过程会一直重复,直到文件的最后一行。

最终效果是将 yourFile 中的每相邻两行合并为一行,中间以逗号和空格分隔。例如,如果原始文件 yourFile 内容如下:

Line1
Line2
Line3
Line4

经过上述命令处理后,输出将是:

Line1, Line2
Line3, Line4

使用 sed 命令

sed 'N;s/\n/, /' yourFile

是对名为 yourFile 的文件使用 sed 工具进行操作的命令。下面对命令进行详细解释:

  1. sed:这是一种流编辑器,用于对文本进行逐行或模式匹配下的编辑操作。它读取输入(此处为 yourFile 文件),根据提供的命令对每一行或选定的行进行修改,并将结果输出。

  2. 'N;s/\n/, /':这是传递给 sed 的命令序列,包含两个部分,由分号 (;) 分隔。

    a. N

    • Nsed 的命令之一,它的作用是读取下一行(Next line),并将当前行与下一行合并为一个临时缓冲区,用换行符 (\n) 分隔。这意味着在执行 N 命令后,sed 的工作空间中将同时包含当前行(即原始的“当前行”)和下一行的内容。

    b. s/\n/, /

    • ssed 中的替换(Substitute)命令,用于查找并替换文本中的模式。
    • \n 表示换行符。在这里,它代表了由 N 命令引入的临时缓冲区中当前行与下一行之间的分隔符。
    • /, / 指定了要替换 \n 的内容,即逗号后跟一个空格(, )。这表示将两行之间的换行符替换为逗号和空格连接的字符串。

综上所述,此 sed 命令的作用是:

  • 对于 yourFile 中的每一行,首先使用 N 命令将其与下一行合并为一个临时缓冲区,两者之间以换行符分隔;
  • 然后应用 s/\n/, / 命令,将临时缓冲区中的换行符替换为逗号和空格连接的字符串,从而实现将相邻两行连接成一行,并以逗号加空格作为分隔的效果;
  • 连接后的行作为新的输出行,被sed打印出来。

参考:

  • stackoverflow question 9605232
  • man awk
  • man sed

相关阅读:

  • 23
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值