我想过滤一些像这样的数据集
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文件。怎么了 - 我该如何解决?
答案 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