前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何用命令行将文本每两行合并为一行?

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

作者头像
程序熵
发布2024-03-25 16:36:58
1300
发布2024-03-25 16:36:58
举报
文章被收录于专栏:技术汇技术汇

更多好文请关注↑

问题:

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

代码语言:javascript
复制
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

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

代码语言:javascript
复制
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

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

代码语言:javascript
复制
KEY 4048:1736 string, 3

如何把两行合并成一行?


答案:

使用 awk 命令

代码语言:javascript
复制
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内容如下:

代码语言:javascript
复制
Line1
Line2
Line3
Line4

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

代码语言:javascript
复制
Line1, Line2
Line3, Line4

使用 sed 命令

代码语言:javascript
复制
sed 'N;s/\n/, /' yourFile

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

  1. sed:这是一种流编辑器,用于对文本进行逐行或模式匹配下的编辑操作。它读取输入(此处为 yourFile 文件),根据提供的命令对每一行或选定的行进行修改,并将结果输出。
  2. 'N;s/\n/, /':这是传递给 sed 的命令序列,包含两个部分,由分号 (;) 分隔。 a. N: b. s/\n/, /
    • ssed 中的替换(Substitute)命令,用于查找并替换文本中的模式。
    • \n 表示换行符。在这里,它代表了由 N 命令引入的临时缓冲区中当前行与下一行之间的分隔符。
    • /, / 指定了要替换 \n 的内容,即逗号后跟一个空格(,)。这表示将两行之间的换行符替换为逗号和空格连接的字符串。
    • Nsed 的命令之一,它的作用是读取下一行(Next line),并将当前行与下一行合并为一个临时缓冲区,用换行符 (\n) 分隔。这意味着在执行 N 命令后,sed 的工作空间中将同时包含当前行(即原始的“当前行”)和下一行的内容。

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

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

参考:

  • stackoverflow question 9605232
  • man awk
  • man sed
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2024-03-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序熵 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题:
  • 答案:
    • 使用 awk 命令
      • 使用 sed 命令
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档