如何使用 awk 从列中拆分字符串

如何使用 awk 从列中拆分字符串

我是 Linux 的菜鸟。我有一个这样的文件:

 col1                                  col2   col3
 ID1234567-DNA_A01 chr1_10203040_T/C   gene   0
 ID1234568-DNA_A02 chr1_10203050_T/A   gene   0
 ID1234569-DNA_A03 chr1_10203060_A/G   gene   0
 ID1234570-DNA_A04 chr1_10203070_C/T   gene   0

我只想使用第一列并将每行分成 4 列:

 #CHROM  POS      REF  ALT
 1       10203040  T    C
 1       10203050  T    A
 1       10203060  A    G
 1       10203070  C    T

我尝试做:

  awk 'BEGIN{OFS="\t";FS="\t"; print"#CHROM","POS","REF","ALT"} | cut -d' ' -f2- {print 
 substr($1,4,1),substr($1,6}' old_file > new_file

我知道我做错了,但任何建议都会有帮助!谢谢

答案1

也许你可以尝试这样做:

cut -d " " -f 2 test.txt | awk -F '[_,/]' 'BEGIN{printf "#CHROM \tPOS\tREF\tALT\n"} {printf ("%s\t %s\t %s\t %s\n" ,$1, $2, $3, $4)}'

这里 test.txt 是文件的名称。如果您想要将输出重定向到文件,只需> new_file.txt在命令末尾添加即可。

答案2

我会选择:

awk 'NR>1 {print $2}' file \
| awk -F'[_/]' 'BEGIN{OFS="\t"; print "#CHROM","POS","REF","ALT"}{$1=$1}1'
  • 首先awk,仅输出第二个字段。
  • 其次awk,选择[_/]作为字段分隔符,打印新的标题和字段。$1=$1触发字段重组,这是必要的,因为我们将输出字段分隔符更改为\t
  • 您可以添加内容| column -t以使列排成一行。

我们可以一次性完成,但之后你需要使用拆分,我认为这样更复杂。


输出:

#CHROM  POS       REF  ALT
chr1    10203040  T    C
chr1    10203050  T    A
chr1    10203060  A    G
chr1    10203070  C    T

答案3

如果你有 GNU awk (gawk),那么 - 尽管有建议这里- 您可以考虑使用正则表达式而不是字符串分割来捕获所需的部分:

$ gawk '
    BEGIN{OFS="\t"; print "#CHROM","POS","REF","ALT"}
    match($2,/chr([0-9])_([0-9]+)_([ACGT])[/]([ACGT])/,a) {print a[1],a[2],a[3],a[4]}
  ' old_file
#CHROM  POS     REF     ALT
1       10203040        T       C
1       10203050        T       A
1       10203060        A       G
1       10203070        C       T

(其他 awk 实现具有该match功能,但 GNU 版本使用捕获组数组扩展了该功能。)

相关内容