在Unix/Linux中如何格式化文件?

4
我有一个包含国家,目录号,年份,描述和价格的文件。
Kenya 563-45 1995 Heron Plover Thrush Gonolek Apalis $6.60
Surinam 632-96 1982 Butterfliers $7.50
Seychelles 831-34 2002 WWF Frogs set of 4 $1.40
Togo 1722-25 2010 Cheetah, Zebra, Antelope $5.70

文件没有用"tab"或":"分隔。它们之间只有空格。请问我该如何格式化这个文件(使用awk?),以及如何从中找到总价格。


1
你想按国家对文件进行排序吗? - wkl
2
这些字段是否以制表符分隔?“按顺序格式化此文件”是什么意思? - cdhowie
嗨,排序顺序无关紧要。我只是想以良好的格式打印它们(也许用制表符分隔每个字段)。我的文件仅由空格分隔(如上所示),我无法逐个字段地识别它们。 - user503566
1
所以第四个字段内部也有空格作为分隔符? 真恶心。 - Cascabel
4个回答

3

使用命令行perl:

$ cat /your/file | perl -e '$sum=0; for(<STDIN>) { $sum += $1 if(/\$([\d\.]+)/); }; print "$sum\n"'
21.2

同时使用 awk 命令(假设每行末尾都有美元符号):

$ cat /your/file | awk '{s+=substr($NF,2)} END{ print s}'
21.2

此外,针对这条评论,如果你想在命令行上重新格式化,请执行以下操作:
$ cat /your/file | perl -e 'for(<STDIN>){@a=split /\s+/; $p=pop @a; \
  $line=join "|", ($a[0],$a[1],$a[2], (join" ",@a[3..$#a]) ,$p); print "$line\n"}'

Kenya|563-45|1995|Heron Plover Thrush Gonolek Apalis|$6.60
Surinam|632-96|1982|Butterfliers|$7.50
Seychelles|831-34|2002|WWF Frogs set of 4|$1.40
Togo|1722-25|2010|Cheetah, Zebra, Antelope|$5.70

如果你想做到这一点,我建议你不要在命令行上操作,而是编写一个合适的程序来解析它。

不错,我也在想这个问题。但是你怎么才能将它们打印到屏幕上,并且每个字段之间用制表符分隔呢? - Learner_51

3

我认为第一列、第二列和最后一列是固定的,但中间的列是不固定的。因此,把中间的列放在最后,并用空格隔开。用制表符分隔固定的列,以便您可以使用电子表格程序开始编辑:

awk '{ printf("%s\t%s\t%s\t%s\t", $1, $2, $3, $NF); for(i=4; i<NF; i++){ printf("%s ", $i); } printf("\n") }' < yourlist.txt


1
扩展udslk的答案,在这里awk绝对是你的好朋友。
#!/usr/bin/env awk -f
BEGIN {
    print "country, \"catalog number\", year, description, \"price ($)\""
}

{
    description = $4
    for (f = 5; f < NF; ++f) {
        description = description " " $f
    }
    price = substr($NF, 2)
    total += price

    printf "\"%s\", \"%s\", \"%s\", \"%s\", %0.2f\n", $1, $2, $3, description, price
}

END {
    printf "Total, , , , %0.2f\n", total
}

这将生成一个带有标题的 CSV 文件,您可以将其导入到您喜爱的电子表格中。它还会添加总计。根据口味,可以将逗号换成制表符。


1

为了符合规范,一个正则表达式-fu的解决方案:

$ perl -lne '/^ (.+?) \s+ (\d+-\d+) \s+ (\d{4}) \s+ (.+?) \s+ ( \$ ( \d+ (?:\.\d+)? ) ) \s* $/x and $t+=$6, print join "•",$1,$2,$3,$4,$5 }{ print $t' input_file
Kenya•563-45•1995•Heron Plover Thrush Gonolek Apalis•$6.60
Surinam•632-96•1982•Butterfliers•$7.50
Seychelles•831-34•2002•WWF Frogs set of 4•$1.40
Togo•1722-25•2010•Cheetah, Zebra, Antelope•$5.70
21.2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接