首页 > 解决方案 > 仅连接匹配字符串的行

问题描述

我有文件 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 但没有一个有效。

标签: awksedgrep

解决方案


我会按照 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 中测试)


推荐阅读