Shell脚本生成特定列作为单独的文件

时间:2014-09-03 01:15:21

标签: bash shell awk

我想从radius.dat打印我的第一列和第二列,并将其保存到rad.2.out,第一列,第三列为rad.3.out,依此类推。

然而,这个脚本似乎并没有起作用。

#!/bin/bash 
for i in {2..30}
do
awk '{print $1, $i}' radius.dat > 'rad.'$i'.out'
done

2 个答案:

答案 0 :(得分:2)

使用awk即可:

awk '{for(i=2;i<=NF;i++) print $1, $i > ("rad."i".out")}' radius.dat

唯一需要注意的是,它会导致许多打开的文件,如果你不在古代awk上,这可能不是问题。

我们在这里做的基本上是使用迭代器并从第二个开始迭代遍历列,并在每次迭代期间使用命名约定将第一列和迭代器打印到输出文件。

更新(根据您对问题的评论):

如果您发现too many open files错误,则可以执行以下操作:

awk '{
    for (i=2; i<=NF; i++) { 
        print $1, $i >> ("rad."i".out"); 
        close("rad."i".out")
    }
}' file

请注意,在第二个选项中,我们使用>>代替>。这是因为我们在每次迭代后关闭文件,因此我们需要确保不会覆盖现有文件。

答案 1 :(得分:0)

你的报价很不合适...... awk永远不会得到专栏。试试这个:

#!/bin/bash 
for i in {2..30}; do
  awk "{print \$1, \$$i;}" radius.dat > "rad.$i.out"
done