使用Linux命令行过滤

时间:2016-05-06 00:03:23

标签: linux csv awk

我想过滤一些像这样的数据集

1    26
1    32
2    45
2    56
3    26
.
.
1000  33

列= 1的所有字段都必须导出到csv文件,并且列= 2,等等。我的代码是:

for i in {0..1000}
do
    awk '$1=="$i" {print $1,$2} ' Gowalla_edges.txt > file{$i}.csv
done

但只是创建空的csv文件。怎么了 - 我该如何解决?

1 个答案:

答案 0 :(得分:2)

麻烦的是shell不会扩展.validation-tooltip-text:before { content: "\f12a"; // http://fortawesome.github.io/Font-Awesome/icon/exclamation/ font-family: fontAwesome; left: 10px; position: absolute; font-size: 20px; line-height:22px; height: 22px; width: 22px; border-radius: 50%; border: 2px solid #fff; text-align: center; vertical-align:middle; top: 12px; color: white; } ,因为它位于单引号内:

$i

您应该使用awk '$1=="$i" {print $1,$2} ' Gowalla_edges.txt > file{$i}.csv 选项将shell变量传递给-v

awk

最简单的改变是这个(在awk -v i="$i" '$1 == i {print $1,$2}' Gowalla_edges.txt > file{$i}.csv 附近有两个额外的单引号):

"$i"

这两种方法都有效。

但是,您的整个过程会有点慢,因为它会对源数据进行1000次传递。如果你只处理几千行,那也许没关系,但它太慢了(数百万行)。

数据是按排序顺序排列的吗?如果它被排序会更有效,尽管这个脚本应该工作,即使它不是(它只会打开一些输出文件多次)。您应该能够对数据使用单次传递,如下所示:

awk '$1=='"$i"' {print $1,$2}' Gowalla_edges.txt > file{$i}.csv

在您的样本数据上,它会生成:

awk '$1 != old { if (file) close(file)
                 file = "file" $1 ".csv"; old = $1 }
               { print $0 >> file }' Gowalla_edges.txt