我想修改一个文件,其中制表符和空格都用作字段分隔符。在开始时,我们有一个具有这种结构的文件:
chr1 Cufflinks gene_id "XLOC_000001"; oId "XR_003076322.1";
chr1 Cufflinks gene_id "XLOC_000012"; oId "XR_001548508";执行awk -F' ' '$4=$6 {print $0}'执行我正在寻找的内容(将"gene_id“的值更改为”oId“中的值):
chr1 Cufflinks gene_id "XR_003076322.1"; oId "XR_003076322.1";
chr1 Cufflinks gene_id "XR_001548508"; oId "XR_001548508";问题在于它改变了行结构:chr1、Cufflinks和gene_id之间的选项卡Cufflinks消失了。我尝试添加-v OFS=\t,但是它在gene_id "XLOC_000012"; oId "XR_001548508";部件中放置制表符(应该用空格分隔)。我也尝试过使用sed,类似于sed -i 's/ /\t/',但它也将标签放在任何地方。
如何将第1列的字段分隔符更改为3(而不将第3列更改为6)?
发布于 2020-11-05 16:30:52
使用awk的可能性:
awk -F '[ ]' '{$2 = $4; print}' file通过使用输入字段分隔符的空格字符(相对于空格和制表符),可以将字段分配给它,而无需将制表符字符更改为空格。
对于更复杂的情况,有split (但没有"join"):
awk 'BEGIN {FS=OFS="\t"} {n = split($3, a, " "); a[2] = a[4]; for (i=1; i<=n; ++i)
$3 = (i == 1 ? "" : $3 " ") a[i]
} 1' file发布于 2020-11-05 11:56:55
您可以使用保留空白空间的sed:
sed -E $'s/^([ \t]*([^ \t]+[ \t]+){3})[^ \t]+([ \t]+)(([^ \t]+[ \t]+){1})([^ \t]+)/\\1\\6\\3\\4\\6/' ffchr1 Cufflinks gene_id "XR_003076322.1"; oId "XR_003076322.1";
chr1 Cufflinks gene_id "XR_001548508"; oId "XR_001548508";关于将第6个字段复制到第4个字段的说明:
^:#匹配start([ \t]*([^ \t]+[ \t]+){3}):#匹配前4-1字段,捕获组#1[^ \t]+:#匹配第4 field([ \t]+):#匹配空格后的第4字段,在组#3(([^ \t]+[ \t]+){1}):#匹配下一步(6-4-1)字段和在组#4([^ \t]+):#匹配第6字段中捕获,在组#6\\1\\6\\3\\4\\6:位置捕获返回substitution中的引用
或者,此awk还创建一个表格对齐输出:
awk '$4=$6' file | column -t
chr1 Cufflinks gene_id "XR_003076322.1"; oId "XR_003076322.1";
chr1 Cufflinks gene_id "XR_001548508"; oId "XR_001548508";https://stackoverflow.com/questions/64696479
复制相似问题