Kar*_*rli 2 grep sed awk string
我有一个这样的文件:
id target_id length eff_length
1 intron_FBgn0000721:20_FBgn0000721:18 1136 243.944268
1 intron_FBgn0000721:19_FBgn0000721:18 1122 240.237419
2 intron_FBgn0264373:2_FBgn0264373:3 56 0
3 intron_FBgn0027570:4_FBgn0027570:3 54 0
Run Code Online (Sandbox Code Playgroud)
对于第2列target_id,我想只保留字符串(并不总是FBgnXXXX之间,有时是其他名字)intron_和第一:。因此,新的输出文件第 2 列的值将更简单,但文件的其余部分保持不变。
我尝试使用 sed 命令,但不知道如何删除我不需要的部分。
sed和column:$ sed -E 's/ intron_([^:]*):[^[:space:]]*/ \1/' file | column -t
id target_id length eff_length
1 FBgn0000721 1136 243.944268
1 FBgn0000721 1122 240.237419
2 FBgn0264373 56 0
Run Code Online (Sandbox Code Playgroud)
其中的关键部分是替换命令:
s/ intron_([^:]*):\S*/ \1/
Run Code Online (Sandbox Code Playgroud)
它查找第一个冒号前后的intron_所有内容并将其保存intron_到变量中1。 [^[:space:]]*匹配从冒号到字段末尾的所有内容。所有这些都被保存在变量中的文本替换1。
awk与制表符分隔的输出:$ awk -v "OFS=\t" '{$2=$2;sub(/intron_/, "", $2); sub(/:.*/, "", $2); print}' file
id target_id length eff_length
1 FBgn0000721 1136 243.944268
1 FBgn0000721 1122 240.237419
2 FBgn0264373 56 0
Run Code Online (Sandbox Code Playgroud)
解释:
-v "OFS=\t"
这将输出字段分隔符设置为选项卡。这有助于排列列,可能使column不必要的。
$2=$2
打印一行时,awk除非我们更改行上的某些内容,否则不会更改为我们新指定的输出字段分隔符。将第二个字段分配给第二个字段足以确保输出具有选项卡。
sub(/intron_/, "", $2)
这intron_将从第二个字段中删除。
sub(/:.*/, "", $2)
这将从第二个字段中删除第一个冒号之后的所有内容。
print
这将打印我们的新行。
awk自定义列格式这与上面的类似,但使用printf以便我们可以根据需要自定义格式列宽和对齐方式:
$ awk '{sub(/intron_/, "", $2); sub(/:.*/, "", $2); printf "%-3s %-12s %8s %3s\n",$1,$2,$3,$4}' file
id target_id length eff_length
1 FBgn0000721 1136 243.944268
1 FBgn0000721 1122 240.237419
2 FBgn0264373 56 0
Run Code Online (Sandbox Code Playgroud)
这里的语句printf "%-3s %-12s %8s %3s\n",$1,$2,$3,$4以通常的printf样式选择列宽和对齐方式。
sed制表符分隔并将其转换为逗号分隔$ sed -E 's/ intron_([^:]*):[^[:space:]]*/ \1/; s/[[:space:]][[:space:]]*/,/g' file
id,target_id,length,eff_length
1,FBgn0000721,1136,243.944268
1,FBgn0000721,1122,240.237419
2,FBgn0264373,56,0
Run Code Online (Sandbox Code Playgroud)