使用列、更改其格式时遇到的问题

问题描述 投票:0回答:1

我有一个文件,其中包含与此类似的各种行数。

05ALBUZZI             CLAUDIA MARIA       LBZCDM64M53F205R       236.41       197.01         6.70

我的目标是,通过主要使用 awk 和 sed,来:

  • 从第一列中删除前两个字符(因此在本例中为 05),并将它们放到它自己的列中,位于第一列之前

  • 用 ; 分隔所有列,同时保持包含空格的字段(在本例中,第二列上的名称字段的名称为 Claudia Maria)完好无损,并且不将它们分成两列

  • 最后,获取所有利润超过1500的代理商线路(利润显示在最后三列,利润为三列之和)

我一直在尝试首先使用以下命令选择前两个字符:

awk 'FS="\t" { $0 = substr($1, 3) } 1' Agenti.txt
awk 'NR>1 {print $2}' Agenti.txt

但我得到的结果好坏参半。但由于在其余练习中解决这个问题至关重要,因此我发现基本上不可能从这里继续。

linux shell awk sed
1个回答
0
投票

我看到你的尝试之一:

awk 'FS="\t" { $0 = substr($1, 3) } 1' Agenti.txt

正在尝试将

FS
设置为选项卡,因此我假设您的输入是制表符分隔的。

只是逐步实现您的目标...

从第一列中删除前两个字符(所以在这个 案例,05)并将它们带到它自己的列上,在列之前 一个

$ mv file Agenti.txt
$ cat tst.awk
BEGIN { FS=OFS="\t" }
{
    sub(/../,"&"FS)
    print
}
$ awk -f tst.awk Agenti.txt
05      ALBUZZI CLAUDIA MARIA   LBZCDM64M53F205R        236.41  197.01  6.70

用 ; 分隔所有列,同时保留包含空格的字段 (对于本示例,第二列上的名称字段的名称为 Claudia Maria)完好无损,并且没有将它们分成两列

$ cat tst.awk
BEGIN { FS="\t"; OFS=";" }
{
    sub(/../,"&"FS)
    $1 = $1
    print
}
$ awk -f tst.awk Agenti.txt
05;ALBUZZI;CLAUDIA MARIA;LBZCDM64M53F205R;236.41;197.01;6.70

最后,获得所有利润超过的代理商的线路 1500(利润显示在最后三列,利润是 三列之和)

$ cat tst.awk
BEGIN { FS="\t"; OFS=";" }
{
    sub(/../,"&"FS)
    $1 = $1
    profit = $(NF-2) + $(NF-1) + $NF
}
profit > 1500
$ awk -f tst.awk Agenti.txt
$
© www.soinside.com 2019 - 2024. All rights reserved.