使用awk从每一行输出格式化字段

时间:2016-08-16 18:36:09

标签: string bash unix awk sed

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

a 中,我按空格/制表符分隔数据,最后一列有空格。

即:

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

这里," 10 X 10 S.A。"和#34; 1 SOYORRO S.A。"是最后列。

我需要做的是:

以某种方式输出 a b 的每一行中的某些字段,具体取决于是否存在" 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会有帮助吗?

感谢。

3 个答案:

答案 0 :(得分: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变量传递。

答案 1 :(得分:1)

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

我会使用一个保护表达式而不是if并将字段移动到只有一个print语句,但这只是样式问题。

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

答案 2 :(得分: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;