AWK:如果左边一列小于右边一列,则需要在两列之间交换值
AWK: Need to swap values between two columns if the left one is smaller than the right one
到目前为止我得到的是一个 Bed-Table 文件,这个文件的问题是,在某些行中,第 2 列中的值大于第 3 列中的值。
awk 中是否有任何一种衬垫可以交换这两个值,以便 table 始终在第 2 列中获得较小的值而在第 3 列中获得较大的值?
chr01 100 200
chr02 300 150
因此在此示例中,所需的输出为:
chr01 100 200
chr02 150 300
你可以使用 awk,
awk '>{x=;=;=x}1' file
awk '{ printf("%s %d %d\n",,( < ) ? : ,( < ) ? : ) }' file
如果顺序错误,只需使用临时变量交换列:
$ awk ' > { temp = ; = ; = temp } 1' OFS='\t' file
末尾的1
是{print}
的普通shorthand,所以每一行都打印出来。将输出字段分隔符 OFS
设置为制表符可保留格式。
或者:
$ awk -F'\t' ' > { [=11=] = FS FS } 1' file
如有必要,使用已设置为制表符的输入字段分隔符 FS
重新排列行的内容。
到目前为止我得到的是一个 Bed-Table 文件,这个文件的问题是,在某些行中,第 2 列中的值大于第 3 列中的值。
awk 中是否有任何一种衬垫可以交换这两个值,以便 table 始终在第 2 列中获得较小的值而在第 3 列中获得较大的值?
chr01 100 200
chr02 300 150
因此在此示例中,所需的输出为:
chr01 100 200
chr02 150 300
你可以使用 awk,
awk '>{x=;=;=x}1' file
awk '{ printf("%s %d %d\n",,( < ) ? : ,( < ) ? : ) }' file
如果顺序错误,只需使用临时变量交换列:
$ awk ' > { temp = ; = ; = temp } 1' OFS='\t' file
末尾的1
是{print}
的普通shorthand,所以每一行都打印出来。将输出字段分隔符 OFS
设置为制表符可保留格式。
或者:
$ awk -F'\t' ' > { [=11=] = FS FS } 1' file
如有必要,使用已设置为制表符的输入字段分隔符 FS
重新排列行的内容。