基于内容的两列交换

时间:2015-12-02 13:18:21

标签: r awk sed dataframe

我使用以下代码

交换了文件中的列
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时才能交换列。

你会建议实现它的方法吗?

2 个答案:

答案 0 :(得分:2)

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

$ 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采用默认操作来打印整个记录。

答案 1 :(得分:1)

sed版本(将分隔符保持为

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

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

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