gpt4 book ai didi

linux - 使用 Linux 命令行过滤

转载 作者:太空宇宙 更新时间:2023-11-04 09:25:23 24 4
gpt4 key购买 nike

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

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

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

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

但只是创建空的 csv 文件。出了什么问题——我该如何解决?

最佳答案

问题是 shell 不会扩展 $i 因为它在单引号内:

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

您可能应该使用 -v 选项将 shell 变量传递给 awk:

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

最简单的更改是这样(在 "$i" 旁边有两个额外的单引号):

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

这两个都可以。

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

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

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

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

$ ls -l file*.csv
-rw-r--r-- 1 jleffler staff 10 May 5 17:28 file1.csv
-rw-r--r-- 1 jleffler staff 8 May 5 17:28 file1000.csv
-rw-r--r-- 1 jleffler staff 10 May 5 17:28 file2.csv
-rw-r--r-- 1 jleffler staff 5 May 5 17:28 file3.csv
$ cat file2.csv
2 45
2 56
$

关于linux - 使用 Linux 命令行过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37062173/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com