拆分特定列的awk字段分隔符不能按预期工作,$ 0返回unsplit记录?

时间:2018-03-16 21:20:17

标签: awk split field

我试图用下划线分割记录。最初它是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

2 个答案:

答案 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中,无论你想做什么。