白日依山尽,黄河入海流。欲穷千里目,更上一层楼。 -- 唐·王之涣

Shell实现文件中的N行合并为一行

背景

有时候想从网页上把一些表格类数据下载下来,但是页面有没有提供下载功能,直接复制下来粘贴到文本文件每个列又换行成独自的一行,如何实现自动转化呢?核心就是文件行的合并

实现方式

1
2
3
4
5
6
# 这里的N是55行合并为1行;合并之后的分隔符为 '|' 
# 方式一
sed 'N; N; N; N; s/\n/|/g;' /tmp/lc-101802.txt

# 方式二
cat /tmp/lc-101802.txt |awk 'ORS=NR%5?"|": "\n"{print}'

扩展

1.1、sed中的**n**** 和 **N** 、****-n**** **

首先要知道sed有个 pattern space , 在读取行处理行都是在该空间中处理的。n 和 N 的目的就是读取下一行到pattern space, 区别在于

  • n 读取下一行进行p命令输出的时候,是针对的读入的下一行,不会输出之前已经读入的
  • N 读取下一行之后,会把之前读入的和刚才读入的作为一行进行处理,比如打印
  • -n 只显示匹配处理的行

image.png

小技巧: 输出100以内的奇偶数

1
2
3
4
# 奇数
seq 1 100 | sed 'p;n'
# 偶数
seq 1 100 | sed 'n;p'

1.2、awk 常用内置变量

ORS output record seperator 输出记录分隔符
RS record seperator 记录分隔符

FS field seperator 字段分隔符,默认空格
OFS out of field seperator 输出字段分隔符

NF 一条记录的字段数目
NR 已经读出的记录数,即行号,从1开始

作者

Colin

发布于

2021-12-25

许可协议