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