Bash中如何匹配含指定数字的行并拆分输出到对应文件
问题说明
现有file.txt文件,内容如下:
01_ABC_0000 AA 02_CDE_0000 BB 03_EFG_0000 CC 04_ABC_0001 DD 05_CDE_0001 EE 06_EFG_0001 FF
需要按规则拆分为两个文件:
file0.txt:保存第一字段末尾为0000的3行file1.txt:保存第一字段末尾为0001的3行
此前尝试的提取命令仅能拿到第一字段末尾数字,无法完成文件拆分,且第一字段为下划线分隔格式,直接以下划线作为分隔符处理无法满足要求。
实现方案
方案1:单awk命令(推荐,无额外依赖,效率最高)
不需要拼接sed、不需要以下划线做分隔符,直接提取第一个字段的最后4位字符判断归属,整行写入对应文件即可:
awk '{ suffix = substr($1, length($1)-3, 4) if (suffix == "0000") print > "file0.txt" if (suffix == "0001") print > "file1.txt" }' file.txt
命令逻辑说明:
- awk默认以空格作为字段分隔符,
$1天然就是每行第一个字段(如01_ABC_0000),不需要额外处理分隔规则 substr($1, length($1)-3, 4)直接取第一个字段的最后4位字符,完全不关心字段内部的下划线分布,适配下划线分隔不好处理的问题- 匹配到对应后缀的行直接写入目标文件,不需要生成中间临时结果
方案2:grep命令(写法最简单)
如果确认0000/0001只会出现在第一字段末尾的位置,可以直接用grep匹配写入:
grep "_0000[[:space:]]" file.txt > file0.txt grep "_0001[[:space:]]" file.txt > file1.txt
匹配规则限定了后缀前面是下划线、后面是空白字符,不会误匹配行内其他位置的相同数字串。
执行完上述任意一种方案后,直接查看file0.txt和file1.txt即可得到预期的拆分结果。
内容的提问来源于stack exchange,提问作者user18091468
相关产品推荐
相关产品推荐

