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

String 使用awk从每行输出格式化字段,string,bash,unix,awk,sed,String,Bash,Unix,Awk,Sed,将a设为文本文件,将b设为unl文件 在a中,我得到了由空格/制表符分隔的数据,最后一列得到了空格 即: 这里,“10 X 10 S.A.”和“1 SOYORRO S.A.”是最后一列 我需要做的是: 根据是否存在“E”(第二列),将每行中的某些字段从a到b进行分组,每个字段应以分号“;”包括最后一个字段分隔 输出格式为: 20160727;30714931330; ;1.0000;201608; 20160727;30594465497;E;0.0044;201608; 其中,第一个字段是

a设为文本文件,将b设为unl文件

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

即:

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


我需要做的是: 根据是否存在“E”(第二列),将每行中的某些字段从ab进行分组,每个字段应以分号“;”包括最后一个字段分隔

输出格式为:

20160727;30714931330; ;1.0000;201608;
20160727;30594465497;E;0.0044;201608;
其中,第一个字段是YYYYMMDD格式的发布日期(它不在文件中)。我怎么能把它拿到这里来

我做了几件事,结果得到:

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

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


谢谢。

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

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

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

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

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

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

使用
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
变量传递。

使用
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)。一开始就抓住一次。要使用“;”分隔输出,请使用
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;

当前时间始终从日期起可用(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;

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