Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Unix/Linux中格式化文件?_Linux_Shell_Unix - Fatal编程技术网

在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
}