使用 awk 重新排列列

rmb*_*rmb 17 awk text-processing

我试图通过使用将我的 csv 文件的第 7 列移到最后

awk -F '{print $1,$2,$3,$4,$5,$6,$8,$9,$10,$11,$7}',OFS= "$file"
Run Code Online (Sandbox Code Playgroud)

其中 $file 是目录中的 .csv 文件。然而,输出是

awk:                          ^ syntax error
Run Code Online (Sandbox Code Playgroud)

有谁知道如何解决这个错误?

Jay*_*got 14

-F选项需要一个参数(字段分隔符):-F,例如。

awk脚本的结尾必须用(空格字符)与其余参数分隔。

如果字段分隔符是,并且您希望保留它,并且列数是常量且小于或等于 11,请尝试以下操作:

awk -F, '{print $1,$2,$3,$4,$5,$6,$8,$9,$10,$11,$7}' OFS=, "$file"
Run Code Online (Sandbox Code Playgroud)

如果您的字段分隔符是分号,请不要忘记将其设置在引号中

awk -F, '{print $1,$2,$3,$4,$5,$6,$8,$9,$10,$11,$7}' OFS=, "$file"
Run Code Online (Sandbox Code Playgroud)

  • @anuribs 很少有程序允许这样做。标准方式是`command file > newfile && mv newfile file`。也就是说,较新版本的 GNU `awk` 支持这个:`gawk -i inplace '{blah blah}' file`。 (8认同)

jim*_*mij 9

更短的解决方案是

awk -F',+' -v OFS=, '{$(NF+1)=$7; $7=""; $0=$0; $1=$1}1' file
Run Code Online (Sandbox Code Playgroud)

我不确定是否,+适用于所有awk版本,但至少适用于 GNU awk,也适用于-c兼容模式。

解释:

  • $(NF+1)=$7:首先我们将第 7 个字段添加到行尾($12=$7在这种情况下可能是)
  • $7="":在下一步中,第 7 个字段被擦除(但周围的分隔符保留)
  • 要删除分隔符,我们需要重新设置整个记录(通过$0=$0)将多个逗号视为字段分隔符(这是通过 完成的-F',+',这里+表示一次或多次),并且还重新排列当前记录通过$1=$1使用先前设置的输出字段强制重建行分隔符(由选项设置-v OFS=,
  • 在所有洗牌完成后,我们准备打印结果 1

示例输入:

1,2,3,4,5,6,7,8,9,10,11
Run Code Online (Sandbox Code Playgroud)

输出

1,2,3,4,5,6,8,9,10,11,7
Run Code Online (Sandbox Code Playgroud)


ter*_*don 5

如果您使用 打印OFS=,则字段之间没有分隔符,您可以简单地将 的值保存$7在一个变量中,设置$7为空并直接打印行和变量。您不需要指定所有字段:

$ cat file
1,2,3,4,5,6,7,8
$ awk -F, -vOFS= '{k=$7; $7=""; print $0,k}' file 
12345687
Run Code Online (Sandbox Code Playgroud)