基于r内容的两列交换



我使用以下代码交换了文件中的列

awk '{ t=$1 ; $1=$2; $2=t; print }' inp_file > out_file

我想根据第二列中的内容交换文件(基于内容的交换)。

输入文件:

226 PRE1 0 0 2 2
228 PRE2 0 0 2 -9
CCC1 1 0 0 2 2
CCC2 1 0 0 2 2

输出文件:

PRE1 226 0 0 2 2
PRE2 228 0 0 2 -9
CCC1 1 0 0 2 2
CCC2 1 0 0 2 2

只有当第二列的内容为PRE时,才需要交换列。

你能提出实现它的方法吗?

这很容易,在操作之前添加一个条件,

$ awk '$2 ~ /PRE/{ t=$1 ; $1=$2; $2=t}1' input
PRE1 226 0 0 2 2
PRE2 228 0 0 2 -9
CCC1 1 0 0 2 2
CCC2 1 0 0 2 2

它做什么

  • 第二列的$2 ~ /PRE/正则表达式与PRE 的匹配

  • 我们从动作{}中删除print,因为我们需要始终打印,而不仅仅是在匹配模式时。

  • 1末尾的1总是计算为true,在这种情况下,awk将采取默认操作来打印整个记录。

sed版本(保持分隔符原样

sed 's/^([^[:blank:]]{1,})([[:blank:]]{1,})(PRE[^[:blank:]]*)/321/' inp_file > out_file

awk(第一个分隔符可能被重写)

awk '{if((t=$2)~/PRE/){$2=$1;$1=t};print}' inp_file > out_file

最新更新