我有一个这种格式的大文件,我向您展示其前几行,包括标题。
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
基本上什么都不做,需要重新组织字段(到处使用新的字段分隔符)Final
1
仅用于打印修改后的所有内容。