Awk 根据特定列中的数据输出文件

Awk 根据特定列中的数据输出文件,awk,Awk,使用输入文件,我将生成所需的输出 我正在尝试使用下面所示的代码,找出如何准确地获得所需的输出结果 第2列中输入文件的信息需要在输出文件中,从第21列到80列,填充所有范围。 awk ' function range_to_out() { out=(out sep (start == last

使用输入文件,我将生成所需的输出

我正在尝试使用下面所示的代码,找出如何准确地获得所需的输出结果

第2列中输入文件的信息需要在输出文件中,从第21列到80列,填充所有范围。

awk '                                                            
  function range_to_out() {                                      
    out=(out sep (start == last ? start : (start "-" last)))     
  }                                                              
  function print_out() {                                         
    printf "%s              %s\n", p1, out","                                   
  }                                                              
  NR == 1 { start=last=$2; p1=$1; next }                         
  {                                                              
    if ($2 == last+1) { last=$2 } else {                         
      range_to_out(); sep=","; start=last=$2                     
    }                                                            
  }                                                              
  $1 != p1 || length(out) > 50 { print_out(); sep=out=""; p1=$1 }
  END { range_to_out(); print_out() }                            
' file
所需输出:

X52152              1214-1216,1218-1221,1233,1222,1245,1223,1246,1249,1251,     
X52152              1224-1232,1234-1243,1247,1250,1253-1254,1332,1331,1333-1336,
X52152              1338,1337,1339-1340,1467.                                   
X52155              1215-1216,1218-1221,1233,1222,1245,1223,1246,1249,1251,1248,
X52155              1224-1232,1234-1243,1247,1250,1253-1254,1332,1331,1333-1336,
X52155              1338,1337,1339-1341.                                         
这里是使用的代码。

awk '                                                            
  function range_to_out() {                                      
    out=(out sep (start == last ? start : (start "-" last)))     
  }                                                              
  function print_out() {                                         
    printf "%s              %s\n", p1, out","                                   
  }                                                              
  NR == 1 { start=last=$2; p1=$1; next }                         
  {                                                              
    if ($2 == last+1) { last=$2 } else {                         
      range_to_out(); sep=","; start=last=$2                     
    }                                                            
  }                                                              
  $1 != p1 || length(out) > 50 { print_out(); sep=out=""; p1=$1 }
  END { range_to_out(); print_out() }                            
' file
这个问题与之前的问题类似,我是否从格伦·杰克曼先生那里得到了代码。 这是他的密码。此代码与使用单列的其他输入文件完美配合

  awk '                                                                    
    function printrange() { print start (start == last ? "" : "-" last) }
    NR == 1 {start=last=$1; next}                                        
    $1 == last+1 {last=$1; next}                                         
    {printrange(); start=last=$1}                                        
    END {printrange()}                                                   
' file | paste -sd" " | fold -sw 60 | tr ' ' ',' | sed 's/^/111111              /'
提前谢谢

输入文件

X52152      1214
X52152      1215
X52152      1216
X52152      1218
X52152      1219
X52152      1220
X52152      1221
X52152      1233
X52152      1222
X52152      1245
X52152      1223
X52152      1246
X52152      1249
X52152      1251
X52152      1224
X52152      1225
X52152      1226
X52152      1227
X52152      1228
X52152      1229
X52152      1230
X52152      1231
X52152      1232
X52152      1234
X52152      1235
X52152      1236
X52152      1237
X52152      1238
X52152      1239
X52152      1240
X52152      1241
X52152      1242
X52152      1243
X52152      1247
X52152      1250
X52152      1253
X52152      1254
X52152      1332
X52152      1331
X52152      1333
X52152      1334
X52152      1335
X52152      1336
X52152      1338
X52152      1337
X52152      1339
X52152      1340
X52152      1467
X52155      1215
X52155      1216
X52155      1218
X52155      1219
X52155      1220
X52155      1221
X52155      1233
X52155      1222
X52155      1245
X52155      1223
X52155      1246
X52155      1249
X52155      1251
X52155      1248
X52155      1224
X52155      1225
X52155      1226
X52155      1227
X52155      1228
X52155      1229
X52155      1230
X52155      1231
X52155      1232
X52155      1234
X52155      1235
X52155      1236
X52155      1237
X52155      1238
X52155      1239
X52155      1240
X52155      1241
X52155      1242
X52155      1243
X52155      1247
X52155      1250
X52155      1253
X52155      1254
X52155      1332
X52155      1331
X52155      1333
X52155      1334
X52155      1335
X52155      1336
X52155      1338
X52155      1337
X52155      1339
X52155      1340
X52155      1341

您的
awk
代码如下所示:

function print_stuff(label,string,    t) {
    # abuse $0 as it makes life easy
    t = $0; $0 = string;
    # replace values with "-" if a-1,a,a+1
    for (i=2;i<NF;++i) {
        if      ($i == $(i-1)+1 && $i == $(i+1)-1) $i="-"
        else if ($(i-1) == "-"  && $i == $(i+1)-1) $i="-"
        else if ($i == $(i-1)+1)                   $i="- "$i
    }
    # substitute all " - - - " with "-" and all  " " with ","
    gsub(/ [ -]+/,"-"); gsub(/ /,",")
    # print columns
    while (length($0)>=60) {
       match(substr($0,1,60),/,[^,]*$/)
       printf "%-20s", label; print substr($0,1,RSTART)
       $0=substr($0,RSTART+1)
    }
    printf "%-20s", label; print $0"."
    $0 = t;
}
{ gsub(/\r/,"",$0) }             # get rid of the cariage return
(NR == 1) { a=$1; b = $2; next } # initialize
(a == $1) { b = b" "$2; next }   # append values
(a != $1) {  print_stuff(a,b); a = $1; b = $2 } # print
END { print_stuff(a,b) }         # print last
函数打印内容(标签、字符串、t){
#滥用0美元,因为它使生活变得轻松
t=$0;$0=字符串;
#如果a-1、a、a+1,则将值替换为“-”
对于(i=2;i=60){
匹配(substr($0,1,60),/,[^,]*$/)
printf“%-20s”,标签;打印子文件($0,1,RSTART)
$0=substr($0,RSTART+1)
}
printf“%-20s”,标签;打印$0“
$0=t;
}
{gsub(/\r/,“”,$0)}摆脱cariage返回
(NR==1){a=$1;b=$2;next}#初始化
(a==1){b=b”“$2;next}#追加值
(a!=$1){打印(a,b);a=$1;b=$2}打印
结束{打印(a,b)}最后打印
这将产生:

$ awk -f main.awk <file>

X52152              1214-1216,1218-1221,1233,1222,1245,1223,1246,1249,1251,
X52152              1224-1232,1234-1243,1247,1250,1253-1254,1332,1331,1333-1336,
X52152              1338,1337,1339-1340,1467.
X52155              1215-1216,1218-1221,1233,1222,1245,1223,1246,1249,1251,1248,
X52155              1224-1232,1234-1243,1247,1250,1253-1254,1332,1331,1333-1336,
X52155              1338,1337,1339-1341.
$awk-f main.awk
X5215214-12161218-12211233122124512212451223124612491251,
X5215224-12321234-1243124712503-1254133213311313-1336,
X5215213381371339-13401467。
X521551215-12161218-1221123312212124512231246124912511248,
X52155 1224-12321234-1243124712503-1254133213311313-1336,
X52155 13381371339-1341。

您的
awk
代码如下所示:

function print_stuff(label,string,    t) {
    # abuse $0 as it makes life easy
    t = $0; $0 = string;
    # replace values with "-" if a-1,a,a+1
    for (i=2;i<NF;++i) {
        if      ($i == $(i-1)+1 && $i == $(i+1)-1) $i="-"
        else if ($(i-1) == "-"  && $i == $(i+1)-1) $i="-"
        else if ($i == $(i-1)+1)                   $i="- "$i
    }
    # substitute all " - - - " with "-" and all  " " with ","
    gsub(/ [ -]+/,"-"); gsub(/ /,",")
    # print columns
    while (length($0)>=60) {
       match(substr($0,1,60),/,[^,]*$/)
       printf "%-20s", label; print substr($0,1,RSTART)
       $0=substr($0,RSTART+1)
    }
    printf "%-20s", label; print $0"."
    $0 = t;
}
{ gsub(/\r/,"",$0) }             # get rid of the cariage return
(NR == 1) { a=$1; b = $2; next } # initialize
(a == $1) { b = b" "$2; next }   # append values
(a != $1) {  print_stuff(a,b); a = $1; b = $2 } # print
END { print_stuff(a,b) }         # print last
函数打印内容(标签、字符串、t){
#滥用0美元,因为它使生活变得轻松
t=$0;$0=字符串;
#如果a-1、a、a+1,则将值替换为“-”
对于(i=2;i=60){
匹配(substr($0,1,60),/,[^,]*$/)
printf“%-20s”,标签;打印子文件($0,1,RSTART)
$0=substr($0,RSTART+1)
}
printf“%-20s”,标签;打印$0“
$0=t;
}
{gsub(/\r/,“”,$0)}摆脱cariage返回
(NR==1){a=$1;b=$2;next}#初始化
(a==1){b=b”“$2;next}#追加值
(a!=$1){打印(a,b);a=$1;b=$2}打印
结束{打印(a,b)}最后打印
这将产生:

$ awk -f main.awk <file>

X52152              1214-1216,1218-1221,1233,1222,1245,1223,1246,1249,1251,
X52152              1224-1232,1234-1243,1247,1250,1253-1254,1332,1331,1333-1336,
X52152              1338,1337,1339-1340,1467.
X52155              1215-1216,1218-1221,1233,1222,1245,1223,1246,1249,1251,1248,
X52155              1224-1232,1234-1243,1247,1250,1253-1254,1332,1331,1333-1336,
X52155              1338,1337,1339-1341.
$awk-f main.awk
X5215214-12161218-12211233122124512212451223124612491251,
X5215224-12321234-1243124712503-1254133213311313-1336,
X5215213381371339-13401467。
X521551215-12161218-1221123312212124512231246124912511248,
X52155 1224-12321234-1243124712503-1254133213311313-1336,
X52155 13381371339-1341。


您的问题包括简洁、可测试的样本输入和预期输出。也不要指望我们访问外部站点。如果它太大了,不适合你的问题,那么你需要创建一个更简单的例子。我们不希望看到80+列的样本!请参阅,特别是关于创建一个.Ed的部分,我添加了输入文件,它有点长,但出于此目的需要。TKS为什么需要这么长时间?在我看来,输入可能是该长度的十分之一,您可以将所需的输出指定为宽度的四分之一,并且仍然可以表达相同的问题,而无需我们费力地通过这么多输入数据来试图理解它。Ed,我明白,编辑输入文件是否更好?或者像这样保持下去,在将来的问题上听取你的建议。TKSIT不工作的原因是由于输入中的回车。你必须摆脱那些DOS
\r
。因此出现了重复标记。您的问题应包括简洁、可测试的示例输入和预期输出。也不要指望我们访问外部站点。如果它太大了,不适合你的问题,那么你需要创建一个更简单的例子。我们不希望看到80+列的样本!请参阅,特别是关于创建一个.Ed的部分,我添加了输入文件,它有点长,但出于此目的需要。TKS为什么需要这么长时间?在我看来,输入可能是该长度的十分之一,您可以将所需的输出指定为宽度的四分之一,并且仍然可以表达相同的问题,而无需我们费力地通过这么多输入数据来试图理解它。Ed,我明白,编辑输入文件是否更好?或者像这样保持下去,在将来的问题上听取你的建议。TKSIT不工作的原因是由于输入中的回车。你必须摆脱那些DOS
\r
。因此出现了重复标记。嗨,克万图尔,惊人的代码和完美的解释。我看到一些奇怪的东西,您的代码输出125012541332应该是12501253-12541332,因为1253和1254是连续数。你可以在你的代码中修改它,然后它就会完美。很多tk。13391340也应该是1339-1340。@OXXO我已经更新了代码。请注意,由于缺少规范,原始问题非常不清楚。此外,请记住,我们不是编码服务。我们喜欢帮助别人,但你不能指望我们为你提供现成的解决方案。Kvantour,Tks,我正在从论坛的专家那里学习和获取知识,我总是在发帖之前尝试自己编写代码。为了改进,我问了一些问题。感谢你的评论,我一定会继续改进。我发布了一些代码,目的是借助论坛用户的专业知识来完善代码。。再次感谢。克万托尔,你能推荐一个AWK在线培训课程吗?@OXXO我将开始学习。这给了你很多关于awk如何工作的信息