拆分特定列的awk字段分隔符无法按预期工作,$0是否返回未拆分的记录?
我正在尝试按下划线分割记录。最初,它是关于作为FS的拆分特定列的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_
\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内获得预期的输出,因此我会接受他的回答。可能没有办法接受两个答案?不,没有办法接受两个答案,但有两个答案完全没关系。接受一个答案只是表明哪个答案对你帮助最大的一个标记,所以你接受另一个答案是有意义的,因为它对你帮助最大。