【问题标题】:Use awk to output formated fields from each line使用 awk 从每一行输出格式化的字段
【发布时间】:2016-12-23 06:10:54
【问题描述】:

a 为文本文件,b 为 unl 文件。

a中,我得到了由空格/制表符分隔的数据,最后一列有空格。

IE:

30714931330     1.0000  201608  10 X 10 S.A.
30594465497  E  0.0044  201608  1 SOYORRO S.A.

这里,“10 X 10 S.A.”和“1 SOYORRO S.A.”是最后一个列。


我需要做的是:

在每一行中从 ab 输出一些字段,其方式取决于“E”(第二列)是否存在,以及每个字段应该用分号“;”隔开包括最后一个。

输出格式为:

20160727;30714931330; ;1.0000;201608;
20160727;30594465497;E;0.0044;201608;

第一个字段YYYYMMDD格式的发行日期(不在a文件中)。我怎么能得到它并把它放在这里?

我做了一些事情,结果我得到了:

awk '{if($2 == "E") {print $issueDate ";" $1 ";" "E;" $3 ";" $4 ";" > "b.unl"} else {print $issueDate ";" $1 ";" " ;" $2 ";" $3 ";" > "b.unl"}}' a.txt

或者

awk '{if($2 == "E") {print $issueDate ";" $1 ";" "E;" $3 ";" $4 ";"} else {print $issueDate ";" $1 ";" " ;" $2 ";" $3 ";"}' a > b

这是实现它的正确方法吗? 否则,我该怎么做?使用 sed 会有帮助吗?

谢谢。

【问题讨论】:

  • (a) 有不止一种类型的UNL 文件。你用的是哪一个? (b) “第一个字段是发行日期......我不知道如何获取它。”您可能需要提供更多关于该日期的信息。
  • wrt separated data by spaces/tabs - 制表符和空格是随机散布在您的文件中,还是它们都出现在文件中的特定位置?请编辑您的问题以在示例输入中显示制表符 (<tab>) 和空格 (<blank>) 出现的位置,因为这对正确的解决方案有很大影响。

标签: string bash unix awk sed


【解决方案1】:

当前时间始终从日期(1) 开始可用。一开始就抓一次。要使用“;”分隔输出,请使用 OFS 变量:

BEGIN {
    FS = "\t"
    "date +'%Y%m%d'" | getline date
}

{ e = " " }

$2 == "E" {
    e  = "E";
    $2 = $3;
    $3 = $4;
}

{
    OFS = ";"
    print date, $1, e, $2, $3 ";"
}

调用为:

$ awk -f E.awk E.txt 

20160816;30714931330; ;1.0000;201608;
20160816;30594465497;E;0.0044;201608;

【讨论】:

    【解决方案2】:

    gawk 固定字段宽度

    $ awk -v OFS=';' -v d="$issueDate" 'BEGIN{FIELDWIDTHS="11 2 1 2 6 2 6 35"}
                                             {print d,$1,$3,$5,$7}' file
    
    20160727;30714931330; ;1.0000;201608
    20160727;30594465497;E;0.0044;201608
    

    并将日期作为awk 变量传递。

    【讨论】:

      【解决方案3】:

      您的意思是输出的第一个字段是当前时间戳吗?如果是这样,您可以使用函数strftime()systime()

      我会使用保护表达式而不是 if 并将字段转换为只有一个打印语句,但这只是风格问题。

      awk '
          $2 == "E" { e="E"; $2=$3 ; $3=$4; }
          { print strftime("%Y%m%d", systime()) ";" $1 ";" e ";" $2 ";" $3 ";"}
      '
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-23
        • 1970-01-01
        • 1970-01-01
        • 2015-05-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多