awk:将文件的每一列打印到单独的文件中

时间:2018-02-22 16:56:24

标签: awk

我有一个包含100列数据的文件。我想在99个单独的文件中打印第一列和第i列,我正在尝试使用

for i in {2..99}; do awk '{print $1" " $i }' input.txt > data${i}; done

但我收到错误

awk: illegal field $(), name "i"
 input record number 1, file input.txt
 source line number 1

如何在{print}中正确使用$ i?

3 个答案:

答案 0 :(得分:2)

全awk解决方案。第一个测试数据:

$ cat foo
11 12 13
21 22 23

然后是awk:

$ awk '{for(i=2;i<=NF;i++) print $1,$i > ("data" i)}' foo

和结果:

$ ls data*
data2  data3
$ cat data2
11 12
21 22

for从2迭代到最后一个字段。如果您希望处理更多字段,请将NF更改为您喜欢的数字。如果由于某种原因,一百个打开的文件在您的系统中出现问题,您需要将print放入一个块并添加close电话:

$ awk '{for(i=2;i<=NF;i++){f=("data" i); print $1,$i >> f; close(f)}}' foo

答案 1 :(得分:2)

关注单awk也可以帮助您:

awk -v start=2 -v end=99 '{for(i=start;i<=end;i++){print $1,$i > "file"i;close("file"i)}}' Input_file

答案 2 :(得分:1)

如果你想做你想做的事情:

for i in {2..99}; do
    awk -v x=$i '{print $1" " $x }' input.txt > data${i}
done

请注意

  • awk的-v开关传递变量
  • $x是变量x
  • 中定义的第n列

注意2:这不是最快的解决方案,一次调用最快,但我只是尝试纠正您的逻辑。理想情况下,花些时间来理解awk,这绝不是浪费时间