我正在循环中运行一个脚本,该脚本根据某些逻辑创建一些数据,然后以某种组合显示输出,但我得到的输出位于新行中
Roll number : 187437366
Mobile Number : 07995036927
Grade : A
Roll number : 187437367
Mobile Number : 07995036937
Grade : B
但是我想要以表格格式输出,如下所示 -
Roll Number | Mobile Number | Grade
187437366 | 07995036927 | A
187437466 | 07995037922 | A2
187437266 | 07995036921 | B
187437766 | 07995036120 | C
我无法找到如何实现这一目标的概念......有人可以帮助我吗?
答案1
awk
当然,它并不是工具箱中唯一的工具。只是为了平衡不可避免的大量awk
脚本,这里是磨坊主行动中:
%mlr --ixtab --ips : --opprint cat << END 卷号:187437366 手机号码 : 07995036927 等级:A 卷号:187437367 手机号码 : 07995036937 等级:B 结尾 卷号 手机号码 等级 187437366 07995036927 A 187437367 07995036937乙 %
只需让您的脚本在每条记录后发出一个空行,或者添加一个中间过滤器来执行此操作,您所拥有的就是“XTAB”输入格式,并作为:
“对分隔符”字符(参见--ixtab
和--ips
选项)。
上述是“PPRINT”输出格式。对于更像问题的输出,可以--barred
选择“PPRINT”和“Markdown”替代输出格式--omd
。但是,我没有立即提供最新版本的 Miller 进行演示。
答案2
一班轮:
$ awk -F':' '{printf "%s%s", $2, (/^Grade/)?"\n":"\t|"}' file
输出:
187437366 | 07995036927 | A
187437367 | 07995036937 | B
答案3
使用awk
制表符和|
作为分隔符:
awk -F: '
BEGIN{ printf "%s\t|%s\t|%s","Roll Number","Mobile Number","Grade"}
{ gsub(/ /,"",$2); printf "%s", ($1 ~ "^Roll" ? RS : "\t|") $2 }
END { print "" }
' file
在块中,使用制表符和每个字段之间的BEGIN
打印标题。 然后从第二个字段(前导和尾随)中删除所有空格字符并|
- 如果第一个字段以 开头
Roll
,则添加记录分隔符RS
(换行符),否则打印制表符并|
- 打印第二个字段
在END
块中,打印另一个换行符。
输出:
Roll Number |Mobile Number |Grade
187437366 |07995036927 |A
187437367 |07995036937 |B
答案4
无需将代码耦合到输入文件中的任何数据值,而是仅依赖于重复的标头值:
$ cat tst.awk
BEGIN {
FS = "[[:space:]]*:[[:space:]]*"
OFS = "|"
}
seen[$1]++ { prt() }
{
hdrs[++numFlds] = $1
vals[numFlds] = $2
}
END { prt() }
function prt( fldNr) {
if ( !doneHdr++ ) {
for (fldNr=1; fldNr<=numFlds; fldNr++) {
printf "%s%s", hdrs[fldNr], (fldNr<numFlds ? OFS : ORS)
}
}
for (fldNr=1; fldNr<=numFlds; fldNr++) {
printf "%s%s", vals[fldNr], (fldNr<numFlds ? OFS : ORS)
}
numFlds = 0
delete seen
}
。
$ awk -f tst.awk file | column -s'|' -o' | ' -t
Roll number | Mobile Number | Grade
187437366 | 07995036927 | A
187437367 | 07995036937 | B