我试图用下划线分割记录。最初它是urwid.Divider()
和_
作为FS,仅适用于第一列。但是现在看来根本没有拆分工作了吗?
.
我尝试了很多变体,例如
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
我错过了一些明显的东西吗?
编辑:是的我做了:"尝试通过设置FS和OFS来改变记录中的字段分隔符是一个常见的错误,然后期望打印一个普通的'print'或'print $ 0'修改后的记录。" (awk手册,"理解$ 0")编辑:并且为了达到最终目标(仅在第一列中分割_和。,这个有效(至少在一行中用""分开):
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 { OFS = "\t" }
{
split ($1, a, "_")
split (a[3], b, "\\.")
print $2, a[2], b[1]
}' test_file.tsv
答案 0 :(得分:2)
$0
是awk中的整行。
awk -F_ '{$1=$1;print}' sample.csv
输入字段分隔符为_
,默认输出字段分隔符为空格。
{$1=$1;print}
根据输出分隔符重建字段并将它们全部打印出来。
输出:
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
答案 1 :(得分:1)
你误解了在Awk中使用字段分隔符。 Awk的字段分隔符告诉Awk用什么值来划分输入中的列,默认为空白。
为了帮助您了解正在发生的事情,以下是您目前正在做的事情(我已将数据文件缩减为3行,以便更容易管理):
$awk -F "_" '{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
$awk -F "_" '{print $1}' test_file.tsv
mg.reads.per.gene
mg.reads.per.gene
mg.reads.per.gene
$awk -F "_" '{print $2}' test_file.tsv
bcsZ
bcsZ
bcsZ
$awk -F "_" '{print $3}' test_file.tsv
A1.tsv contig
A1.tsv contig
A2.tsv contig
$awk -F "_" '{print $4}' test_file.tsv
21128 476
3712 1774
38480 184
请参阅,您已将输出划分为4列,每次有下划线时都会将其分解,其中包括$1
,$2
,$3
和{ {1}}。请注意,$4
会返回字段分隔符连接的所有列,这看起来就像您的初始输入。
您想要的是将所有下划线交换为空格,以便看起来有6列。使用$0
命令可以非常轻松地完成此操作:
tr
现在你已经有了六列,如果你想要的话,你可以将输出输入到awk中,无论你想做什么。