我使用以下代码
交换了文件中的列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
时才能交换列。
你会建议实现它的方法吗?
答案 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