awk 文件操作

awk 文件操作

我有一个这种格式的大文件,我向您展示其前几行,包括标题。

gene    c1  c2  c3  c4  c5  c6  c7  c8
G1*1    0   0   0   0   0   0   0   0
G2*2    0   0   0   0   1   1   1   1
G3*3    0   0   2   2   44  44  62  62
G4*4    22  0   46  0   1308    7   1773    4

基因的第一行是标题行。我想保持原样,然后我想用 FS = * 分割剩余的行,这样现在我就有一个像这样的文件作为输出

gene    coord   c1  c2  c3  c4  c5  c6  c7  c8
G1  1   0   0   0   0   0   0   0   0
G2  2   0   0   0   0   1   1   1   1
G3  3   0   0   2   2   44  44  62  62
G4  4   22  0   46  0   1308    7   1773    4

所以我也想在标题行中放置一个名为“coord”的额外字段,这样当我分割后续行时,我就已经订购了所有内容。

我知道如何使用 awk 进行分割,但标题行让我感到困惑

awk -F '*' -v OFS="\t" '{print $1,$2}' ##This is for 2nd line and onwards

答案1

标题行是一种特殊情况,因此您可以将其作为特殊情况处理。

awk -F '*' -v OFS='\t' \
  'NR == 1 { sub(/^gene/, "&" OFS "coord"); print; next }
  { print $1, $2 }'

答案2

使用是awk绝对要求吗?这看起来更像是一份工作sed

sed '1s/gene/&    coord/;2,$s/\*/  /'

这是不言自明的:

  • 1s/gene/& coord/– 在第一行,将“gene”更改为“gene coord”。
  • 2,$s/\*/ /– 在第二行到文件末尾,将文字“*”更改为空格。

答案3

这是另一种方法:

awk -F '[ \t*]' -v OFS='\t' 'NR==1{$2="coord\t"$2;print;next}{$1=$1}1' file
  • 输入文件对我来说不清楚,所以我使用了 3 个字段分隔符:空格、制表符和*.如果您现在输入得更好,您可能可以从列表中删除某些内容。

  • $1=$1基本上什么都不做,需要重新组织字段(到处使用新的字段分隔符)

  • Final1仅用于打印修改后的所有内容。

相关内容