我试图重新整理包含以下内容的文件的格式:
>Humanl|chr16:86430087-86430726 | element 1 | positive
>Humanl|chr16:85620095-85621736 | element 2 | negative
>Humanl|chr16:80423343-80424652 | element 3 | negative
>Humanl|chr16:80372593-80373755 | element 4 | positive
>Humanl|chr16:79969907-79971297 | element 5 | negative
>Humanl|chr16:79949950-79951518 | element 6 | negative
>Humanl|chr16:79026563-79028162 | element 7 | negative
>Humanl|chr16:78933253-78934686 | element 9 | negative
>Humanl|chr16:78832182-78833595 | element 10 | negative
我的命令是:
awk '{FS="|";OFS="\t"} {print $1,$2,$3,$4,$5}'
这是输出:
>Human|chr16:86430087-86430726 | element 1 |
>Human chr16:85620095-85621736 element 2 negative
>Human chr16:80423343-80424652 element 3 negative
>Human chr16:80372593-80373755 element 4 positive
>Human chr16:79969907-79971297 element 5 negative
>Human chr16:79949950-79951518 element 6 negative
>Human chr16:79026563-79028162 element 7 negative
>Human chr16:78933253-78934686 element 9 negative
>Human chr16:78832182-78833595 element 10 negative
除第一行外,每一行都工作正常。我不明白为什么会这样。
有人可以帮我吗?谢谢!
最佳答案
简短答案
设置FS
和OFS
太晚而影响第一行,请改用以下方法:
awk '{print $1,$2,$3,$4,$5}' FS='|' OFS='\t'
您也可以使用以下较短的版本:
awk -v FS='|' -v OFS='\t' '$1=$1'
答案更长一点
这是行不通的,因为在设置
FS
和OFS
时,awk已经执行了记录/字段拆分。您可以通过将$0
设置为$0
来强制重新拆分,例如:awk '{FS="|";OFS="\t";$0=$0} {print $1,$2,$3,$4,$5}'
做到这一点的常规方法是:1.在
FS
子句中设置BEGIN
和其他代码; 2.通过-v VAR=VALUE
表示法设置它们;或3.在脚本后将它们追加为VAR=VALUE
。我首选的样式是最后一个选择:awk '{print $1,$2,$3,$4,$5}' FS='|' OFS='\t'
请注意,设置
-v
和后脚本变量之间存在显着差异。 -v
将在BEGIN
子句之前设置变量,而后脚本设置将在BEGIN
子句之后设置变量。