【发布时间】:2012-08-09 03:09:00
【问题描述】:
我有一个文件有几千行数据,每一行都像:a:b:c:d
例如:
0.0:2000.00:2000.04:2000.02
我想在一个文件中获取所有 a,在第二个文件中获取 b,等等。如何?
【问题讨论】:
标签: linux awk text-processing
我有一个文件有几千行数据,每一行都像:a:b:c:d
例如:
0.0:2000.00:2000.04:2000.02
我想在一个文件中获取所有 a,在第二个文件中获取 b,等等。如何?
【问题讨论】:
标签: linux awk text-processing
一种方式。输出文件将被命名为 fileX,每个列号都带有 X。
假设 infile 包含内容:
0.0:2000.00:2000.04:2001.02
0.1:2002.00:2000.05:2003.02
0.2:2003.00:2002.04:2004.02
0.3:2001.00:2000.05:2000.03
0.3:2001.00:2000.04:2001.02
0.2:2001.00:2002.04:2000.02
执行这个awk 命令:
awk '
BEGIN {
FS = ":";
}
{
for ( i = 1; i <= NF; i++ ) {
print $i > "file" i;
}
}
' infile
检查输出文件:
head file[1234]
结果如下:
==> file1 <==
0.0
0.1
0.2
0.3
0.3
0.2
==> file2 <==
2000.00
2002.00
2003.00
2001.00
2001.00
2001.00
==> file3 <==
2000.04
2000.05
2002.04
2000.05
2000.04
2002.04
==> file4 <==
2001.02
2003.02
2004.02
2000.03
2001.02
2000.02
【讨论】:
【讨论】:
cut 不会在一次数据传递中执行 I/O 重定向。对于小文件,重新扫描无关紧要。对于管道(无文件)或大文件,它可能(当然,在管道中有解决“无文件”的方法)。
怎么样:
cat filename|cut -d ':' -f1 > a.txt
然后你可以为第二个字段写-f2,并把它放在b.txt中。
【讨论】:
cut 4次);它涉及对 4 个字段的文件进行 4 次传递,如果文件存在且很小,这无关紧要,但如果没有文件(例如,它是在管道中生成的结果),则变得很麻烦,或者如果文件很大(对于大的合适定义,可能以兆字节的倍数衡量)。您还赢得了UUOC 奖。