使用特定列集的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