在Unix/Linux中格式化文件?
我有一个包含国家、目录号、年份、说明和价格的文件在Unix/Linux中格式化文件?,linux,shell,unix,Linux,Shell,Unix,我有一个包含国家、目录号、年份、说明和价格的文件 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 文件不由“制表符”或“:”分隔。它们之间只有空格。您能告诉
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
文件不由“制表符”或“:”分隔。它们之间只有空格。您能告诉我如何格式化此文件(使用awk?)以及如何从中找到总价吗 使用命令行perl:
$ cat /your/file | perl -e '$sum=0; for(<STDIN>) { $sum += $1 if(/\$([\d\.]+)/); }; print "$sum\n"'
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
$cat/your/file | perl-e'for(){@a=split/\s+/;$p=pop@a\
$line=join“|”,($a[0],$a[1],$a[2],(join”“@a[3..$#a]),$p);打印“$line\n”}
肯尼亚| 563-45 | 1995 |苍鹭-船鸫-Gonolek Apalis | 6.60美元
苏里南| 632-96 | 1982 |蝴蝶| 7.50美元
塞舌尔| 831-34 | 2002 | WWF青蛙一套4只| 1.40美元
多哥| 1722-25 | 2010 |猎豹、斑马、羚羊| 5.70美元
如果您想正确地执行此操作,我不会在cmd行上执行此操作,而是编写一个正确的程序来解析它。我认为前3列和最后一列是固定的,这意味着中间的列不是固定的。因此,中间的列最后保留在中间,中间有空格,固定的列通过制表符分开,这样您就可以开始使用一些电子表格程序进行编辑:
awk'{printf(“%s\t%s\t%s\t%s\t”,$1,$2,$3,$NF);
对于(i=4;i符合性,a-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
在这里,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
}
!/usr/bin/env awk-f
开始{
打印“国家”、“目录号”、“年份、说明”、“价格($)\”
}
{
description=$4
对于(f=5;f
这会弹出一个带有标题的CSV文件,您可以将其导入到您喜爱的电子表格中。它还会添加总数。根据口味用制表符切换逗号。是否要按国家对文件进行排序?字段制表符是否分隔?您所说的“按顺序格式化此文件”是什么意思您好,排序顺序不重要。我只是想以一种好的格式打印它们(可能用一个选项卡分隔每个字段)。我的文件仅用空格分隔(如上所示)我没有办法一个字段一个字段地识别它们。所以在第四个字段中也有空格分隔字段?哎呀。很好,我也在想这个问题。但是你如何将它们打印到屏幕上,每个字段用一个标签隔开。
#!/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
}