我使用以下代码交换了文件中的列
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