awk - 仅连接匹配字符串的行
问题描述
我有文件 1
C2
H1
H2
H3
H4
L1
L10
L2
L3
L4
和文件 2
/C2/C2_CRRA200017850-1a_H3LJWDSXY_L1
/H1/H1_CRRA200017885-1a_H3LJWDSXY_L1
/H1/H1_CRRA200017885-1a_H5MLCDSXY_L1
/H2/H2_CRRA200017886-1a_H3LJWDSXY_L1
/H3/H3_CRRA200017887-1a_H3LJWDSXY_L1
/H4/H4_CRRA200017888-1a_H3LJWDSXY_L1
/L1/L1_CRRA200017897-1a_H3LJWDSXY_L1
/L2/L2_CRRA200017898-1a_H3LJWDSXY_L1
/L3/L3_CRRA200017899-1a_H3LJWDSXY_L1
/L4/L4_CRRA200017900-1a_H3LJWDSXY_L1
/L4/L4_CRRA200017900-1a_H5MLCDSXY_L1
我需要生成一个输出,如果文件 2 中的多行匹配文件 1 中的字符串,则将它们连接起来,否则打印单行。
/C2/C2_CRRA200017850-1a_H3LJWDSXY_L1
/H1/H1_CRRA200017885-1a_H3LJWDSXY_L1 /H1/H1_CRRA200017885-1a_H5MLCDSXY_L1
/H2/H2_CRRA200017886-1a_H3LJWDSXY_L1
/H3/H3_CRRA200017887-1a_H3LJWDSXY_L1
/H4/H4_CRRA200017888-1a_H3LJWDSXY_L1
/L1/L1_CRRA200017897-1a_H3LJWDSXY_L1
/L2/L2_CRRA200017898-1a_H3LJWDSXY_L1
/L3/L3_CRRA200017899-1a_H3LJWDSXY_L1
/L4/L4_CRRA200017900-1a_H3LJWDSXY_L1 /L4/L4_CRRA200017900-1a_H5MLCDSXY_L1
另一种思考方式是,如果文件 2 中的行在//处具有相同的字符串,则将它们连接起来,否则打印单行。
尝试了几个 grep cmd 但没有一个有效。
解决方案
我会按照 GNUAWK
的方式完成这项任务,让file.txt
内容成为
/C2/C2_CRRA200017850-1a_H3LJWDSXY_L1
/H1/H1_CRRA200017885-1a_H3LJWDSXY_L1
/H1/H1_CRRA200017885-1a_H5MLCDSXY_L1
/H2/H2_CRRA200017886-1a_H3LJWDSXY_L1
/H3/H3_CRRA200017887-1a_H3LJWDSXY_L1
/H4/H4_CRRA200017888-1a_H3LJWDSXY_L1
/L1/L1_CRRA200017897-1a_H3LJWDSXY_L1
/L2/L2_CRRA200017898-1a_H3LJWDSXY_L1
/L3/L3_CRRA200017899-1a_H3LJWDSXY_L1
/L4/L4_CRRA200017900-1a_H3LJWDSXY_L1
/L4/L4_CRRA200017900-1a_H5MLCDSXY_L1
然后
awk 'BEGIN{FS="/";ORS=""}NR>=2{print (prev!=$2)?"\n":" "}{print;prev=$2}' file.txt
输出
/C2/C2_CRRA200017850-1a_H3LJWDSXY_L1
/H1/H1_CRRA200017885-1a_H3LJWDSXY_L1 /H1/H1_CRRA200017885-1a_H5MLCDSXY_L1
/H2/H2_CRRA200017886-1a_H3LJWDSXY_L1
/H3/H3_CRRA200017887-1a_H3LJWDSXY_L1
/H4/H4_CRRA200017888-1a_H3LJWDSXY_L1
/L1/L1_CRRA200017897-1a_H3LJWDSXY_L1
/L2/L2_CRRA200017898-1a_H3LJWDSXY_L1
/L3/L3_CRRA200017899-1a_H3LJWDSXY_L1
/L4/L4_CRRA200017900-1a_H3LJWDSXY_L1 /L4/L4_CRRA200017900-1a_H5MLCDSXY_L1
说明:我将字段分隔符( FS
) 设置为/
,我确实使用第二列进行比较,因为第一列是空的(/
每行第一列之前没有任何内容)。我将输出行分隔符( ORS
) 设置为空字符串,因为我将自己提供换行符和空格。对于我print
当前行的每一行并将变量设置为第二列的内容,因此在使用换行符时prev
它确实是以前的值。对于第 2 行和后续行(即数字行( ) 大于或等于 2),在打印行之前,如果之前的 $2 值不同,NR
我要么换行,否则空间,为了这样做,我利用 AWK 三元运算,即条件\n
?
值如果真 值如果:
假。如果您想了解更多关于使用的内置变量的信息,请阅读8 个强大的 Awk 内置变量 – FS、OFS、RS、ORS、NR、NF、FILENAME、FNR
(在 gawk 4.2.1 中测试)
推荐阅读
- javascript - 使用@material-ui/lab 的DataGrid 组件,如何访问当前的活动过滤器?
- java - 如何使用 JavaFX 创建一个 nonogram 板
- javascript - 我需要使用绑定调用 window.requestAnimationFrame
- python - Groupby 带有列的掩码
- javascript - 基于来自 websocket 的数据的 Angular 客户端通知
- python - Tweepy - 仅回复推文作者
- sql - ACCESS 365 和 INSERT INTO 不从 FORM 插入数据
- php - Symfony 5 表单变量不存在
- html - 列表类型消失
- python - PyPDE:理解代码以及如何修复边界条件?