使用awk将某些列移动到末尾
我有一个以制表符分隔的文件,有1000列。我想重新排列,以便某些列必须移动到末尾 有人能帮我使用awk吗 输入示例:使用awk将某些列移动到末尾,awk,Awk,我有一个以制表符分隔的文件,有1000列。我想重新排列,以便某些列必须移动到末尾 有人能帮我使用awk吗 输入示例: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 将第5、6、7、8列移到末尾。 输出: 重新排列两列的一种方法($5变为$20和$20变为$5)其余保持不变: $ awk '{x=$5; $5=$20; $20=x; print}' file.txt 对于4列: $ aw
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
将第5、6、7、8列移到末尾。
输出:
重新排列两列的一种方法(
$5
变为$20
和$20
变为$5
)其余保持不变:
$ awk '{x=$5; $5=$20; $20=x; print}' file.txt
对于4列:
$ awk '{
x=$5; $5=$20; $9=x;
y=$9; $9=$10; $10=y;
print
}' file.txt
这会将列1打印到
a
,然后将b
打印到最后一列,然后将列a+1
打印到b-1
:
$ awk -v a=4 -v b=9 '{for (i=1;i<=NF;i+=i==a?b-a:1) {printf "%s\t",$i};for (i=a+1;i<b;i++) {printf "%s\t",$i};print""}' file
1 2 3 4 9 10 11 12 13 14 15 16
17 18 19 20 5 6 7 8
+=
仅表示“添加到”。i==a?b-a:1
是三元语句。它返回的值取决于i==a
是真还是假。如果为true,则返回冒号前的值。如果为false,则返回冒号后的值
对于(i=a+1;i我的方法:
awk 'BEGIN{ f[5];f[6];f[7];f[8] } \
{ for(i=1;i<=NF;i++) if(!(i in f)) printf "%s\t", $i; \
for(c in f) printf "%s\t", $c; printf "\n"} ' file
awk'BEGIN{f[5];f[6];f[7];f[8]}\
{for(i=1;iawk中的另一种方式
使用最后N个字段切换最后A-B
awk -vA=4 -vB=8 '{x=B-A;for(i=A;i<=B;i++){y=$i;$i=$(t=(NF-x--));$t=y}}1' file
awk-vA=4-vB=8'{x=B-A;对于(i=A;icatfoo | awk'{print$1$2$3$4$9……}
,基本上。@MarcB从不将cat
与能够读取数据的程序一起使用,比如awk
awk'code'foo
。@MarcB谢谢!!是的,可以这样做。但是正如我说的,我有数百列,无法按照你建议的方式指定所有列。我希望你明白我的意思。@user1779730你知道吗“我们必须更清楚。如果没有关于如何识别这些某些列的更多信息,我们无法帮助您编写代码来移动某些列
。这些列之间是否故意存在不同数量的空白?如果是,应如何处理?谢谢!!它可以重新安排两个c!”列之间相互移动。但是,我的查询是按照最初的postAdded示例中的说明重新排列多个列,共4列,请按照逻辑移动更多列我对printf“%s”有一个小问题\n在代码中。我在一个python模块中使用此代码,该模块将%s视为字符串。是否有替代方法来替换printf语句中的“%s”?我尝试使用普通打印,但未能成功。是否可以help@user1779730没问题。请参阅更新,它不使用%
符号,并避免使用printf
。
awk -v a=4 -v b=9 '{out="";for (i=1;i<=NF;i+=i==a?b-a:1) out=out $i"\t";for (i=a+1;i<b;i++) out=out $i "\t";print out}' file
awk 'BEGIN{ f[5];f[6];f[7];f[8] } \
{ for(i=1;i<=NF;i++) if(!(i in f)) printf "%s\t", $i; \
for(c in f) printf "%s\t", $c; printf "\n"} ' file
awk -vA=4 -vB=8 '{x=B-A;for(i=A;i<=B;i++){y=$i;$i=$(t=(NF-x--));$t=y}}1' file
awk -vA=3 -vB=8 '{split($0,a," ");x=A++;while(x++<B)$x=a[NF-(B-x)];while(B++<NF)$B=a[A++]}1' file