awk,sed 需要帮助解决密度问题

awk,sed 需要帮助解决密度问题

我们正在进行一项关于高密度城市宜居性和生活质量的研究,从各种来源获取信息,经过整理后,可以洞悉公寓的密度比,从而有望确定公寓大楼中的“每人可用空间”和“每人集中度”。

在下面的例子中,我们正在寻找仅括号中的单元枚举公寓单元号的最终结果,除了邮政编码之外,其他所有内容都可以忽略。

可以删除 APT 一词。可以删除左右括号。可以删除主要地址,例如下面的 7 Dense Road(我们对精确地址不感兴趣)。纽约 NY 和邮政编码应该保留,因为我们正在按邮政编码研究密度。

您会注意到,有些条目只有一个公寓,没有范围 - 保留这一点很好,但没有必要,因为一个单元公寓通常是顶层公寓或类似公寓,拥有充足的空间 - 我们感兴趣的是“人们住得有多近,他们的配置是什么样的,以及他们有多少邻居”。

因此,例如,在下面提交的公寓范围列表中,最终结果将是每个单元号都在其自己的行上:

我们的输入文本文件如下所示:

7 Dense Road  APT (Range 4A - 4D)
NEW YORK NY 10023-5040
7 Dense Road  APT (Range 5A - 5K)
NEW YORK NY 10023-5042
7 Dense Road  APT (Range 6A - 6E)
NEW YORK NY 10023-5043
7 Dense Road  APT 2A
NEW YORK NY 10023-5040
7 Dense Road  APT 2B
NEW YORK NY 10023-5040
7 Dense Road  APT 2C
NEW YORK NY 10023-5040
7 Dense Road  APT (Range 6F - 6J)

需要的最终结果:

4A NEW YORK NY 10023-5040
4B NEW YORK NY 10023-5040
4C NEW YORK NY 10023-5040
4D NEW YORK NY 10023-5040
5A NEW YORK NY 10023-5042
5B NEW YORK NY 10023-5042
5C NEW YORK NY 10023-5042
5D NEW YORK NY 10023-5042
5E NEW YORK NY 10023-5042
5F NEW YORK NY 10023-5042
5J NEW YORK NY 10023-5042
5K NEW YORK NY 10023-5042
6A NEW YORK NY 10023-5043
6B NEW YORK NY 10023-5043
6C NEW YORK NY 10023-5043
6D NEW YORK NY 10023-5043
6E NEW YORK NY 10023-5043
.
.
.
.

答案1

呃……在这里找到了答案。这也是我自己的问题。去想想吧。

请提供 awk、sed 或其他文本处理建议

上面引用的链接本质上是相同的格式,尽管仍然需要通过 $1 导入每一行。我希望以某种方式通过文件而不是 $1 导入。

#!/bin/bash

PART1=$(echo "$1" | sed 's/\(.*\)\s(.*/\1/')
PART3=$(echo "$1" | sed 's/.*)\(.*\)/\1/')
PART2=$(echo "$1" | sed 's/.*(\s*\(.*\)).*/\1/')

START=$(echo "$PART2" | sed 's/\s*-.*//')
END=$(echo "$PART2" | sed 's/.*-\s*//')

STARTNUM=$(echo "$START" | sed 's/^\(.\).*/\1/')
ENDNUM=$(echo "$END" | sed 's/^\(.\).*/\1/')
if test "$STARTNUM" '!=' "$ENDNUM"; then
    echo "Error: Numeral is different"
    exit 1
fi

STARTLETTER=$(echo "$START" | sed 's/^.\(.\).*/\1/')
ENDLETTER=$(echo "$END" | sed 's/^.\(.\).*/\1/')

OUTPUT=''
for LETTER in A B C D E F G H I J K L M N O P Q R S T U V W X Y Z ; do
    test "$LETTER" '==' "$STARTLETTER" && OUTPUT='yes'
    test -n "$OUTPUT" && echo "$PART1, $STARTNUM$LETTER,$PART3"
    test "$LETTER" '==' "$ENDLETTER" && OUTPUT=''
done

相关内容