前两个字段由 _ 和其余字段分开

gau*_*wal 3 sed awk text-processing bioinformatics

#CHROM  POS     REF     ALT     ../S101_sorted.bam      ../S102_sorted.bam          ../S105_sorted.bam      ../S107_sorted.bam      ../S113_sorted.bam      ../S114_sorted.bam      ../S115_sorted.bam      ../S
Aradu.A01       296611  T       C       T       T       T       T       T       T       T       T       T       T       T       T       T       T       T/C     T       T/C     T       T       T       T
Aradu.A01       326689  T       C       T/C     T       T       T       T/C     T       T       T       T/C     T/C     T       T       T       T       T       T       T       T/C     T/C     T       T
Aradu.A01       615910  T       G       T       T       T       T       T       T       T       T       T       T       T       T       T       T       T       T       T       T       T       T       T
Aradu.A01       661394  T       A       T       T       T       T       T       T/A     T       T       T       T       T       T       T       T       T       T       T       T       T       T       T
Aradu.A01       941674  C       T       C       C/T     C       C       C/T     C       C       C       C       C       C       C       C       C       C       C       C       C       C       C       C
Aradu.A01       942064  C       T       C/T     C/T     C/T     C/T     C/T     C       C       C/T     C       C/T     C/T     C       C       C/T     C/T     C       C       C       C       C/T     C/T
Aradu.A01       954858  G       A       G/A     G       G       G       G       G       G       G       G       G       G       G       G       G       G       G       G/A     G       G       G       G
Aradu.A01       1196780 C       A       C/A     C       C       C       C       C       C       C       C       C       C       C/A     C       C       C/A     C       C       C       C       C       C
Run Code Online (Sandbox Code Playgroud)

我有一个上述格式的文件,我正在尝试按_原样打印由其余列分隔的前两列。我尝试了以下awk脚本螺母它不返回任何输出。

awk '{if (NR>1) print $1"_"$2; for(i=3;i<NF;i++) printf "\t", $i}' input_file > out_file.
Run Code Online (Sandbox Code Playgroud)

任何人都可以建议我在这里做错了什么吗?

Ste*_*uch 7

要将前两列之间的空格更改为下划线,我建议sed

 sed -e 's/[\t ]\+/_/'
Run Code Online (Sandbox Code Playgroud)

如果您需要忽略标题行:

sed -e '/^#/! s/[\t ]\+/_/'
Run Code Online (Sandbox Code Playgroud)

或者,对于更一般的情况(标题可能以任何字符开头;\t仅适用于gnu sed

sed -E '1! s/[[:blank:]]+/_/'
Run Code Online (Sandbox Code Playgroud)

至于关于您的awk代码的问题,第一个print, 应该可能是 aprintf以免它打印不合时宜的换行符。

  • 请注意,所有 `\t`、`\+`、`-E` 都是非标准扩展。POSIXly:`tab=$(printf '\t')` 用于制表符。`sed "s/[[:blank:]]\{1,\}/_/"`。 (2认同)