【问题标题】:Printing range with concatenation串联打印范围
【发布时间】:2021-05-02 00:03:33
【问题描述】:

提取成单个字符串

Number 1:  
Number 2:  55-60(a)
Number 3:  43/32455, 225(c), 26/10533-10541
Number 4:  234(b) 
Number 5:  
Number 6:  643/54231 
Number 7:  10(a), 162(b) 
Number 8:  742/12345,12346
(c=cross,b=bold,a=alpha)

数值(数字)为“数字 4”的数字将是 234c4 等:

Number 4:  234(b) 

"4" or any digit with Number [0-9], will be concatenated with c = c + 4
234 is the value for the Number 4, then 234 + c4 = 234c4 (flagged as b = bold)


Number 6:  643/54231 
value without any flag will be sorted into the cross column along with cross tag (c)

Sorted : 
cross
43c3@SP32455;225c3;643c6@SP54231

打印范围

Number 2: 55-60(a)
Sorted :
alpha
55c2;56c2;57c2;58c2;59c2;60c2

Number 3:  26/10533-10541
cross
26c3@SP10533;26c3@SP10534;26c3@SP10535;26c3@SP10536;26c3@SP10537;26c3@SP10538;26c3@SP10539;26c3@SP10540;26c3@SP10541

一旦列出了所有标记的输出(alpha、bold、cross/a、b、c)。 等:

a / alpha =
55c2;56c2;57c2;58c2;59c2;60c2;10c7
b / bold = 
234c4;162c7
c / cross = 
43c3@SP32455;225c3;26c3@SP10533;26c3@SP10534;26c3@SP10535;26c3@SP10536;26c3@SP10537;26c3@SP10538;26c3@SP10539;26c3@SP10540;26c3@SP10541;643c6@SP54231;742c8@SP12345;742c8@SP12346

它将按照预期输出(逗号分隔)组合成一行,如下

a,b,c
55c2;56c2;57c2;58c2;59c2;60c2;10c7,234c4;162c7,43c3@SP32455;225c3;26c3@SP10533;26c3@SP10534;26c3@SP10535;26c3@SP10536;26c3@SP10537;26c3@SP10538;26c3@SP10539;26c3@SP10540;26c3@SP10541;643c6@SP54231;742c8@SP12345;742c8@SP12346


用于交叉检查的细分:

alpha
55c2;56c2;57c2;58c2;59c2;60c2;10c7
bold
234c4;162c7
cross
43c3@SP32455;225c3;26c3@SP10533;26c3@SP10534;26c3@SP10535;26c3@SP10536;26c3@SP10537;26c3@SP10538;26c3@SP10539;26c3@SP10540;26c3@SP10541;643c6@SP54231;742c8@SP12345;742c8@SP12346

现在我使用一行脚本来打印范围。

for a in {10533..10541}; do echo $a | awk '{printf "26c3@SP%s;",$0}'; done

【问题讨论】:

  • 欢迎来到 Stack Overflow。 SO is a question and answer page for professional and enthusiast programmers。请在您的问题中添加您自己的代码。您应该至少展示自己为解决这个问题所做的研究。
  • 感谢提醒,我会尽快添加自己的脚本
  • @user10254032,感谢您在问题中的努力,但您的示例输入和预期示例输出不清楚,请在您的问题中添加更清晰的解释以获得预期输出,谢谢。跨度>
  • 感谢您调查此问题,我已编辑以下问题
  • @user10254032,请您详细说明234c4 是如何生成的,请按逻辑进行,谢谢。

标签: python awk


【解决方案1】:

这是一个纯 awk 的解决方案。它不是特别可读,我不相信 awk 在这种特殊情况下是适合这项工作的工具。也许某些模式和/或动作可能需要适应。我的解决方案基于您的特定示例案例。

BEGIN { RS = "\n|, |:  " }

$1 ~ /^Number/                 { sub(":", "", $2); current = $2 }
$1 ~ /^[0-9]+-[0-9]+\(a\)$/    { sub(/\(a\)$/, "", $1);
                                 split($1, a, "-")
                                 for (i=a[1]; i <= a[2]; i++)
                                   alpha = alpha (alpha == "" ? "" : ";") sprintf("%dc%d", i, current)
                               }
$1 ~ /^[0-9]+\(a\)$/           { sub(/\(a\)$/, "", $1)
                                 alpha = alpha (alpha == "" ? "" : ";") sprintf("%dc%d", $1, current)
                               }
$1 ~ /^[0-9]+\(b\)$/           { sub(/\(a\)$/, "", $1)
                                 bold = bold (bold == "" ? "" : ";") sprintf("%dc%d", $1, current)
                               }
$1 ~ /^[0-9]+\/[0-9]+$/        { split($1, a, "/")
                                 cross = cross (cross == "" ? "" : ";") sprintf("%dc%d@SP%d", a[1], current, a[2])
                               }
$1 ~ /^[0-9]+\/[0-9]+-[0-9]+$/ { split($1, a, "[/-]")
                                 for (i=a[2]; i <= a[3]; i++)
                                   cross = cross (cross == "" ? "" : ";") sprintf("%dc%d@SP%d", a[1], current, i)
                               }
$1 ~ /^[0-9]+\/[0-9]+,[0-9]+$/ { n = split($1, a, "[/,]");
                                 for (i=2; i <= n; i++)
                                   cross = cross (cross == "" ? "" : ";") sprintf("%dc%d@SP%d", a[1], current, a[i])
                               }

END { print "alpha"; print alpha ; print "bold" ; print bold ; print "cross" ; print cross }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-29
    • 2017-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-16
    相关资源
    最近更新 更多