如何将egrep结果作为变量传入awk,实现CSV指定文本匹配追加
CSV数据处理:提取指定字符串并追加到指定列
输入数据集
col1,col2,col3,col4 read1,chr1,Unassigned_NoFeatures, read2,chr2,Assigned, read3,chr3,,Assigned
需求
提取每行中的Assigned或Unassigned_NoFeatures字符串,将其追加到第一列的read名称后(目标字符串不固定在同一列,需逐行匹配)。
尝试的错误脚本
cat my_file.csv | variable=$(egrep -o "Assigned|Unassigned_NoFeatures") | awk -F, '{print $1"_"variable,$2}'
期望输出
read1_Unassigned_NoFeatures,chr1 read2_Assigned,chr2 read3_Assigned,chr3
解决方法
原脚本的问题在于一次性将所有匹配结果存入变量,无法实现逐行对应。直接使用awk即可完成整个任务,无需额外调用egrep,以下是两种可行方案:
方案一:遍历列匹配
awk -F, 'NR>1 { for(i=1;i<=NF;i++) { if($i ~ /^(Assigned|Unassigned_NoFeatures)$/) { status=$i break } } print $1"_"status","$2 }' my_file.csv
NR>1:跳过表头行- 循环遍历当前行所有列,找到匹配目标字符串的列后赋值给
status - 输出拼接后的第一列与第二列
方案二:整行正则匹配提取
awk -F, 'NR>1 { match($0, /Assigned|Unassigned_NoFeatures/) status=substr($0, RSTART, RLENGTH) print $1"_"status","$2 }' my_file.csv
match()函数在当前行中匹配目标正则,RSTART和RLENGTH分别记录匹配结果的起始位置和长度substr()提取匹配到的字符串,后续输出逻辑与方案一一致
内容的提问来源于stack exchange,提问作者Apex
相关产品推荐
相关产品推荐

