String 使用awk从每行输出格式化字段
将a设为文本文件,将b设为unl文件 在a中,我得到了由空格/制表符分隔的数据,最后一列得到了空格 即: 这里,“10 X 10 S.A.”和“1 SOYORRO S.A.”是最后一列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; 其中,第一个字段是
我需要做的是: 根据是否存在“E”(第二列),将每行中的某些字段从a到b进行分组,每个字段应以分号“;”包括最后一个字段分隔 输出格式为:
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按空格/制表符分隔数据
-制表符和空格是随机分布在您的文件中,还是分别出现在文件中的特定位置?请编辑您的问题,以便在示例输入中显示制表符(
)和空格(
)的位置,因为这对正确的解决方案有很大影响。