我正在尝试从文件中打印收集的数据,其中每组数据都会换行 (\n)
代码:
awk '/mail:|fullName:|uid:/{s=s", "$0} END{print substr(s,3)}' dump2.txt
现在输出:
mail: [email protected] , fullName: Bogus Bogus, uid: 666 mail: [email protected] , fullName: Bogus2 Bogus2, uid: 667
期望的输出:
mail: [email protected] , fullName: Bogus Bogus, uid: 666 \n
mail: [email protected] , fullName: Bogus2 Bogus2, uid: 667 \n
答案1
尝试
awk '/mail:|fullName:/{s=s", "$0} /uid:/ {s=s", "$0 "\n" ;} END{printf substr(s,3)}' dump2.txt
假设字段中没有 %
其他解决方案
awk '/mail:|fullName:/{s=s", "$0} /uid:/ {print substr(s,3) ", "$0 ;s=""} ' dump2.txt
假设 uid: 是最后一个。
答案2
你只需要\n
在想要的地方添加:
awk '/mail:|fullName:|uid:/{s=s", "$0}\n END{print substr(s,3)}' dump2.txt
答案3
另一种技巧:不要将其全部存储在一个大字符串中,而是在进行过程中将其打印出来:
awk '$1=="mail:" || $1=="fullName:" {printf "%s, ", $0} $1=="uid:"' dump2.txt
答案4
注意:以下所有内容(显然)都假设该uid:
行始终是每组的最后一行。但是,它们都适用于%
数据中的字符。
如果您想保存所有数据并在最后打印它,这里有一个稍微简单的方法,使用数组:
awk 'BEGIN {count=0}
/mail:|fullName:|uid:/ {s[count] = s[count] ", " $0} /uid:/ {count++}
END {for (i=0; i<count; i++) print substr(s[i],3)}' dump2.txt
如果您希望能够单独处理字段(在最后),请使用二维数组:
awk 'BEGIN {count=0}
/mail:|fullName:|uid:/ {s[count][$1] = $0} /uid:/ {count++}
END {for (i=0; i<count; i++) printf "%s, %s, %s\n",
s[i]["mail:"], s[i]["fullName:"], s[i]["uid:"]}' dump2.txt
(就像 Glenn 的答案一样,这假设mail:
、fullName:
和uid:
字符串显示为该行中的第一个字段。)
我不知道您提到对齐时的意思,但是,从这里开始,可以轻松排列输出中的字段:
awk 'BEGIN {count=0}
/mail:|fullName:|uid:/ {s[count][$1] = $0} /uid:/ {count++}
END {for (i=0; i<count; i++) printf "%23s, %23s, %s\n",
s[i]["mail:"], s[i]["fullName:"], s[i]["uid:"]}' dump2.txt
➘
邮件:[电子邮件受保护],全名:Bogus Bogus,uid:666 邮件:[电子邮件受保护],全名:Bogus2 Bogus2,uid:667或者
awk 'BEGIN {count=0}
/mail:|fullName:|uid:/ {s[count][$1] = $0} /uid:/ {count++}
END {for (i=0; i<count; i++) printf "%-23s, %-23s, %s\n",
s[i]["mail:"], s[i]["fullName:"], s[i]["uid:"]}' dump2.txt
➘
邮件:[电子邮件受保护] ,全名:Bogus Bogus,uid:666 邮件:[电子邮件受保护],全名:Bogus2 Bogus2,uid:667或者
awk 'BEGIN {count=0}
/mail:|fullName:|uid:/ {s[count][$1] = $0} /uid:/ {count++}
END {for (i=0; i<count; i++) printf "%-23s %-24s %s\n",
s[i]["mail:"] ",",
s[i]["fullName:"] ",",
s[i]["uid:"]}' dump2.txt
➘
邮件:[电子邮件受保护],全名:Bogus Bogus,uid:666 邮件:[电子邮件受保护],全名:Bogus2 Bogus2,uid:667
这个答案 显示如何确定每个字段的最大数据长度。