尝试清理Python客户端的输出。这是一个例子:
+--------------------------+-----------+
| Text | Test |
+--------------------------+-----------+
| 111-222-333-444-55555555 | 123456789 |
| 111-222-333-444-55555555 | 123456789 |
| 111-222-333-444-55555555 | 123456789 |
+--------------------------+-----------+
我开始通过使用以下方式管道输出来移除顶部和底部:
Command_Output | tail -n +4 | head -n -1 |
现在我们有以下内容:
| 111-222-333-444-55555555 | 123456789 |
| 111-222-333-444-55555555 | 123456789 |
| 111-222-333-444-55555555 | 123456789 |
现在我正在尝试删除表中的管道并将表转换为单个逗号分隔的行。但是,仍然保持两个数字之间的相关性很重要,所以也许我应该使用两个分隔符。也许最终输出应如下所示:
111-222-333-444-55555555~123456789,111-222-333-444-55555555~123456789,111-222-333-444-55555555~123456789
所以现在我就在这一点上:
Command_Output | tail -n +4 | head -n -1 | awk '{$3 = "~"; print $0;}'
有人可以帮助我完成最后一部分吗?我需要将表格放到单个逗号分隔的行中。
答案 0 :(得分:2)
Atomiklan's own answer有效,但是:
仅限于单个输入行组,所有输入行都作为单个输出行输出。
使用了几个 GNU 特定选项,这些选项通常不适用于非Linux平台。
使用 4 外部流程,当 1 时,
一种通用解决方案,只使用一个符合POSIX标准的awk
命令,将每个共享相同(概念)第一列值的行块作为单行输出(仍然假设 2列布局):
... | awk '
NR <= 3 || /^\+/ { next } # skip header and footer
prev != "" && prev != $2 { printf "\n"; fsep="" } # see if new block is starting
{ printf "%s", fsep $2 "~" $4; fsep=","; prev=$2 } # print line at hand
END { printf "\n" } # print final newline
'
处理可变数量的列:
... | awk -F ' *\\| *' '
NR <= 3 || /^\+/ { next } # skip header and footer
{ # process each data row
fsep=""; first=1
for (i=1; i<=NF; ++i) { # loop over all fields
if ($i == "") continue # skip empty fields
# See if a new block is starting and print the appropriate record
# separator.
if (first) {
if (prev != "") printf (prev != $i ? "\n" : ",")
prev=$i # save record's 1st nonempty field
first=0 # done with 1st nonempty field
}
printf "%s", fsep $i # print field at hand.
fsep="~" # set separator for subsequent fields
}
}
END { printf "\n" } # print trailing newline
'
答案 1 :(得分:1)
这适用于任意数量的输入列的所有awks:
$ awk -F ' *[|] *' -v OFS='~' 'NF>1 && ++c>1 {$1=$1; gsub(/^~|~$/,""); printf "%s%s", (c>2?",":""), $0} END{print ""}' file
111-222-333-444-55555555~123456789,111-222-333-444-55555555~123456789,111-222-333-444-55555555~123456789
答案 2 :(得分:0)
Command_Output | tail -n +4 | head -n -1 | awk -vORS=, '{ print $2 "~" $4 }' | sed 's/,$/\n/'
感谢您的帮助
答案 3 :(得分:0)
更简单的基于awk的解决方案:
Command | awk -vORS=, '($1=="|" && NR>3 ) {print $2"~"$4}'
然而,这会在结尾处留下尾随,
。解决这个问题:
Command | awk -vORS= '($1=="|" && NR>3 ) {if (NR>4) {print ","}; print $2"~"$4}'
给出:
111-222-333-444-55555555~123456789,111-222-333-444-55555555~123456789,111-222-333-444-55555555~123456789