我是 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 版本使用捕获组数组扩展了该功能。)