让 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会有帮助吗?
感谢。
答案 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;