拆分特定列的awk字段分隔符无法按预期工作,$0是否返回未拆分的记录?

拆分特定列的awk字段分隔符无法按预期工作,$0是否返回未拆分的记录?,awk,split,field,Awk,Split,Field,我正在尝试按下划线分割记录。最初,它是关于作为FS的\uuu和,并且仅用于第一列。但现在看来,分裂根本不起作用 cat test_file.tsv mg.reads.per.gene_bcsZ_A1.tsv contig_21128 476 mg.reads.per.gene_bcsZ_A1.tsv contig_3712 1774 mg.reads.per.gene_bcsZ_A2.tsv contig_38480 184 mg.reads.per.gene_

我正在尝试按下划线分割记录。最初,它是关于作为FS的
\uuu
,并且仅用于第一列。但现在看来,分裂根本不起作用

cat test_file.tsv

mg.reads.per.gene_bcsZ_A1.tsv   contig_21128    476
mg.reads.per.gene_bcsZ_A1.tsv   contig_3712     1774
mg.reads.per.gene_bcsZ_A2.tsv   contig_38480    184
mg.reads.per.gene_bcsZ_A2.tsv   contig_62779    1154
mg.reads.per.gene_bcsZ_A4.tsv   contig_115486   113
mg.reads.per.gene_bcsZ_A4.tsv   contig_14345    937
mg.reads.per.gene_bcsZ_A5.tsv   contig_19362    426
mg.reads.per.gene_bcsZ_A5.tsv   contig_53656    31
mg.reads.per.gene_bcsZ_A6.tsv   contig_100190   26
mg.reads.per.gene_bcsZ_A6.tsv   contig_23343    164
我也尝试过很多变体,比如

awk 'BEGIN { FS = _ } ; {print $0}' test_file.tsv
awk 'BEGIN { FS = '_' } ; {print $0}' test_file.tsv
awk 'BEGIN { FS = "_" } ; {print $0}' test_file.tsv
awk 'BEGIN { FS ="_" } ; {print $0}' test_file.tsv
awk  -F'_' '{print $0}' test_file.tsv
awk -F"gene" '{print $0}' test_file.tsv
它给出了不变的输出。我期待着:

mg.reads.per.gene   bcsZ    A1.tsv   contig 21128    476
mg.reads.per.gene   bcsZ    A1.tsv   contig 3712     1774
mg.reads.per.gene   bcsZ    A2.tsv   contig 38480    184
mg.reads.per.gene   bcsZ    A2.tsv   contig 62779    1154
mg.reads.per.gene   bcsZ    A4.tsv   contig 115486   113
mg.reads.per.gene   bcsZ    A4.tsv   contig 14345    937
mg.reads.per.gene   bcsZ    A5.tsv   contig 19362    426
mg.reads.per.gene   bcsZ    A5.tsv   contig 53656    31
mg.reads.per.gene   bcsZ    A6.tsv   contig 100190   26
mg.reads.per.gene   bcsZ    A6.tsv   contig 23343    164
我是不是漏掉了什么明显的东西

编辑:是的,我这样做了:“简单地通过设置FS和OFS来更改记录中的字段分隔符是一个常见错误,然后期望一个普通的“print”或“print$0”来打印修改后的记录。”(awk手册,“理解$0”)

编辑:并达到最终目标(用u和分隔。仅在第一列中,此项有效(至少在一行中用“;”分隔):

输出:

contig_21128    bcsZ    A1
contig_3712     bcsZ    A1
contig_38480    bcsZ    A2
contig_62779    bcsZ    A2
contig_115486   bcsZ    A4
contig_14345    bcsZ    A4
contig_19362    bcsZ    A5
contig_53656    bcsZ    A5
contig_100190   bcsZ    A6
contig_23343    bcsZ    A6
mg.reads.per.gene bcsZ A1.tsv   contig 21128    476
mg.reads.per.gene bcsZ A1.tsv   contig 3712     1774
mg.reads.per.gene bcsZ A2.tsv   contig 38480    184
mg.reads.per.gene bcsZ A2.tsv   contig 62779    1154
mg.reads.per.gene bcsZ A4.tsv   contig 115486   113
mg.reads.per.gene bcsZ A4.tsv   contig 14345    937
mg.reads.per.gene bcsZ A5.tsv   contig 19362    426
mg.reads.per.gene bcsZ A5.tsv   contig 53656    31
mg.reads.per.gene bcsZ A6.tsv   contig 100190   26
mg.reads.per.gene bcsZ A6.tsv   contig 23343    164

您误解了Awk中字段分隔符的用法。Awk的字段分隔符告诉Awk使用什么值来分隔输入中的列,默认为空白

为了帮助您了解正在发生的事情,以下是您当前正在做的事情(我已将数据文件缩减为3行,以便更易于管理):

请看,您已经将输出精确地划分为4列,每出现一次下划线都会将这些列分开,在awk中分别为
$1
$2
$3
、和
$4
。请注意,
$0
返回由字段分隔符连接的所有列,这与您的初始输入类似

您要做的是将所有下划线替换为空格,以便显示为6列。使用
tr
命令可以非常轻松地完成此操作:

$ tr '_' ' ' < test_file.tsv 
mg.reads.per.gene bcsZ A1.tsv   contig 21128    476
mg.reads.per.gene bcsZ A1.tsv   contig 3712     1774
mg.reads.per.gene bcsZ A2.tsv   contig 38480    184
$tr'\u'''

现在您已经有了六列,如果需要,您可以将输出输入到awk中,然后执行任何其他操作。

$0
是awk中的整行

 awk -F_ '{$1=$1;print}' sample.csv
输入字段分隔符为
\uuu
,默认输出字段分隔符为空格。
{$1=$1;print}
基于输出分隔符重新构建字段并全部打印

输出:

contig_21128    bcsZ    A1
contig_3712     bcsZ    A1
contig_38480    bcsZ    A2
contig_62779    bcsZ    A2
contig_115486   bcsZ    A4
contig_14345    bcsZ    A4
contig_19362    bcsZ    A5
contig_53656    bcsZ    A5
contig_100190   bcsZ    A6
contig_23343    bcsZ    A6
mg.reads.per.gene bcsZ A1.tsv   contig 21128    476
mg.reads.per.gene bcsZ A1.tsv   contig 3712     1774
mg.reads.per.gene bcsZ A2.tsv   contig 38480    184
mg.reads.per.gene bcsZ A2.tsv   contig 62779    1154
mg.reads.per.gene bcsZ A4.tsv   contig 115486   113
mg.reads.per.gene bcsZ A4.tsv   contig 14345    937
mg.reads.per.gene bcsZ A5.tsv   contig 19362    426
mg.reads.per.gene bcsZ A5.tsv   contig 53656    31
mg.reads.per.gene bcsZ A6.tsv   contig 100190   26
mg.reads.per.gene bcsZ A6.tsv   contig 23343    164

你希望打印出什么?
print$0
?这是整行。如果你想要第一个值,请执行
print$1
。我不希望在整行中看到更多的
\uu
,因此是6列而不是3列。你希望得到什么输出?我该怎么做才能打印出整行(使用awk)为了查看拆分是否有效?是否获得上述预期输出?我编辑了这个问题,因为我显然希望awk以错误的方式执行某些操作。因此$1=$1基本上不改变任何内容,但强制awk“重新加载”?@CrazySantacaus它用来重建记录你可以在这里获得更多信息:这是一个很好的解释!我只试了1小时做了一些不可行的事情;-)但是海峡湾告诉我如何在awk内获得预期的输出,因此我会接受他的回答。可能没有办法接受两个答案?不,没有办法接受两个答案,但有两个答案完全没关系。接受一个答案只是表明哪个答案对你帮助最大的一个标记,所以你接受另一个答案是有意义的,因为它对你帮助最大。