使用特定列集的awk或sed更改字段分隔符
我想修改一个同时使用制表符和空格作为字段分隔符的文件。 开始时,我们有一个具有这种结构类型的文件:使用特定列集的awk或sed更改字段分隔符,awk,sed,Awk,Sed,我想修改一个同时使用制表符和空格作为字段分隔符的文件。 开始时,我们有一个具有这种结构类型的文件: 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}'执行我
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
之间的标签\t
,袖扣
和基因id
消失了。我尝试添加-vofs=\t
,但它在基因id“XLOC\u 000012”中添加了标签;oId“XR_001548508”代码>零件(应以空格分隔)。我还尝试了sed
类似于sed-I的//\t/'
的东西,但它也会将标签放在任何地方
如何将第1列的字段分隔符更改为第3列(而不将第3列更改为第6列)?您可以使用此sed
保留空白:
sed-E$'s/^([\t]*([^\t]+[\t]+){3})[^\t]+([\t]+[\t]+){1})([^\t]+)/\\1\\6\\3\\4\\6/'ff
将第6个字段复制到第4个字段的说明:
^
:#匹配开始
([\t]*([^\t]+[\t]+){3}
:#匹配前4-1个字段并在组#1中捕获
[^\t]+
:#匹配第四个字段
([\t]+)
:#匹配第4个字段后的空格,并在第3组中捕获
(([^\t]+[\t]+){1})
:#匹配下一个(6-4-1)字段并在组中捕获#4
([^\t]+)
:#匹配第6个字段并在组中捕获#6
\\1\\6\\3\\4\\6
:在替换中放回引用
或者,此awk
也会创建表格对齐输出:
awk'$4=$6'文件|列-t
chr1袖扣基因_id“XR_003076322.1”;oId“XR_003076322.1”;
chr1袖扣基因“XR_001548508”;oId“XR_001548508”;
awk的可能性:
awk-F'[]'{$2=$4;print}文件
通过使用空格字符作为输入字段分隔符(与空格和制表符相反),可以将字段指定给,而无需将制表符更改为空格
对于更复杂的情况,有split
(但没有“join
”):
awk'BEGIN{FS=OFS=“\t”}{n=split($3,a,”);a[2]=a[4];用于(i=1;i您的条件$4=$6
实际上不是一个条件,=
是一个赋值运算符,所以您想比较$4和$6吗?或者您想将第四个字段的值指定为第六个字段?请确认一下。不,这不是一个条件,是故意的。我需要将$6的值指定给$4Thanks,第一个答案是正确的,但不是第二个,因为它把标签放在了所有的地方。你能解释一下sed命令吗?我需要把它改编成一个更复杂的文件,有超过15列,像这样。我将在我的sed
命令中添加解释。是的,第二个将不会保留原来的空白,但会创建新的表格格式。非常感谢这些解释ns:)它很好用
chr1 Cufflinks gene_id "XR_003076322.1"; oId "XR_003076322.1";
chr1 Cufflinks gene_id "XR_001548508"; oId "XR_001548508";
chr1 Cufflinks gene_id "XR_003076322.1"; oId "XR_003076322.1";
chr1 Cufflinks gene_id "XR_001548508"; oId "XR_001548508";
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