我有一个这样的文件。
chr1 14969 14830 2 100(26) 100(31) 100(46) 100(13) 100(26) 100(30) 100(31) 100(36) 100(38)
chr1 15795 15039 2 100(3) 100(4) 100(4) 100(3) 100(6) 100(4) 100(2) 100(6) 100(6)
chr1 16606 15948 2 80(4) *(0) *(0) 100(1) 75(3) 100(3) 66.67(2) 100(3) *(0)
chr1 16606 16311 2 20(1) *(0) *(0) *(0) 25(1) *(0) 33.33(1) *(0) 100(1)
chr1 16853 16766 2 *(0) *(0) *(0) *(0) *(0) *(0) 100(1) *(0) 100(2)
chr1 16857 16766 2 100(2) 100(5) 100(5) 100(1) 100(2) 100(2) 100(2) 100(4) 100(2)
chr1 17232 17056 2 100(2) 100(4) 100(8) 100(2) 100(2) 100(7) 100(6) 100(5) 100(3)
chr1 17525 17369 2 *(0) *(0) 100(2) *(0) *(0) *(0) *(0) *(0) *(0)
chr1 17605 17056 1 50(9) 38.89(7) 57.89(11) 30(3) *(0) *(0) 40.74(11) 65.52(19) 57.14(16)
chr1 17605 17369 1 50(9) 61.11(11) 42.11(8) 70(7) 100(3) 100(8) 59.26(16) 34.48(10) 42.86(12)
我想将第 3 列与第 2 列交换,如果第 4 列是 2,则将其替换为 -,否则替换为 +。输出应该如下所示。
我想在 awk 中执行此操作。我尝试用这个来交换列。我也希望输出中的标题行保持原样
awk -F '\t' -v OFS="\t" 'NR > 1{a=$2; $2=$3; $3=a;} 1' file
如何将第 4 列更改为 + 和 - 取决于它是 1 还是 2,然后打印第 4 列之后的任意数量的列?
输出
chr1 14969 14830 - 100(26) 100(31) 100(46) 100(13) 100(26) 100(30) 100(31) 100(36) 100(38)
chr1 15795 15039 - 100(3) 100(4) 100(4) 100(3) 100(6) 100(4) 100(2) 100(6) 100(6)
chr1 16606 15948 - 80(4) *(0) *(0) 100(1) 75(3) 100(3) 66.67(2) 100(3) *(0)
chr1 16606 16311 - 20(1) *(0) *(0) *(0) 25(1) *(0) 33.33(1) *(0) 100(1)
chr1 16853 16766 - *(0) *(0) *(0) *(0) *(0) *(0) 100(1) *(0) 100(2)
chr1 16857 16766 - 100(2) 100(5) 100(5) 100(1) 100(2) 100(2) 100(2) 100(4) 100(2)
chr1 17232 17056 - 100(2) 100(4) 100(8) 100(2) 100(2) 100(7) 100(6) 100(5) 100(3)
chr1 17525 17369 - *(0) *(0) 100(2) *(0) *(0) *(0) *(0) *(0) *(0)
chr1 17605 17056 + 50(9) 38.89(7) 57.89(11) 30(3) *(0) *(0) 40.74(11) 65.52(19) 57.14(16)
chr1 17605 17369 + 50(9) 61.11(11) 42.11(8) 70(7) 100(3) 100(8) 59.26(16) 34.48(10) 42.86(12)
谢谢
答案1
awk
例如,使用以下脚本命名script.awk
:
{
temp=$2
$2=$3
$3=temp
if ( $4 == 2 ) {
$4="-"
} else {
$4="+"
}
print
temp=''
}
以下内容似乎可以满足您的要求:
$ awk -F '\t' -v OFS='\t' -f script.awk input