我有一个包含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?
答案 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
请注意
-v
开关传递变量$x
是变量x
注意2:这不是最快的解决方案,一次awk调用最快,但我只是尝试纠正您的逻辑。理想情况下,花些时间来理解awk
,这绝不是浪费时间