AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 497028
Accepted
k-a-v
k-a-v
Asked: 2019-01-28 07:29:32 +0800 CST2019-01-28 07:29:32 +0800 CST 2019-01-28 07:29:32 +0800 CST

Bash 脚本仅适用于某些输入

  • 772

我有一个我已经研究了一段时间的 bash 脚本。基本上,它搜索文本以查找多行的重复。这是我到目前为止所拥有的:

#!/bin/bash

count() {
    count=$(( $3 - $2 + 1 ))
    pattern=$(echo  "$1" | head -n $3 | tail -n $count)
    echo "$1" | pcregrep -Mc "^\Q$(echo "$pattern")\E$"
}

file=$1
fileprep=$(grep -v '=' $file | grep -v '!' | grep -v '*' |  grep -o '[[:digit:]]*' | grep . )
linecount=$(echo "$fileprep" | wc -l)
len=10
start=1
end=$(( $linecount - $len + 1 ))



for i in $(seq $start $end); do
    test="$test\n$(count "$fileprep" $i $((i+len-1)))"
done

a=$(printf $test | grep -v '\b1\b' )

mostrepetitions=$(echo "$a" | sort -rn | head -n1)

for i in $(seq 1 $mostrepetitions); do
    var1=$(printf "$a" | grep '\b'$i'\b' | wc -l)
    var2="$var2\n$(echo $(( var1 / i )))"
done

printf "$var2" | tr '\n' '+' | awk '{print "0"$0}' | bc -l

我发现这在一个简单的文件上可以正常工作,该文件的数字 1-10 重复了两次(像这样):

1
2
3
4
5
6
7
8
9
10
1
2
3
4
5
6
7
8
9
10

在此,它将正确输出 1(len变量为 10)。当len变量变为9时,它会正确输出2,因为1-9和2-10都是至少出现两次的9个线型。

但是,当我在我的目标文件上运行它时(可以在此处找到一个示例),我得到了不可能的结果。

在此脚本中,找到的九行模式的数量必须始终至少是十行模式数量的两倍。以上面的1-10为例。其中,1-10 是唯一的十行模式。但是,其中有 1-9 和 2-10,两者都重复了两次。但是,当我运行我的脚本时,对于十行重复模式,我得到 2 的输出,而对于九行模式,我也得到 2 的输出。这显然是不正确的。为什么会这样?

注意 -fileprep创建变量是为了从输入文件中创建一个数字列表(请参阅我链接的示例文件)。

bash text-processing
  • 1 1 个回答
  • 108 Views

1 个回答

  • Voted
  1. Best Answer
    Stefan Hamcke
    2019-01-28T09:18:37+08:002019-01-28T09:18:37+08:00

    您描述的现象实际上并非不可能,因此您的脚本不是问题。我能想到的最小的例子是 withlen=3而不是len=2,输入文件是

    1
    2
    1
    2
    1
    2
    

    使用len=3,您会得到结果2,但是使用len=2,您不会得到一些≥4您可能会怀疑的数字,而是再次得到结果2。为了获得与 和 相同数量的不同重复模式len=10,len=9您只需将文件外推到 13 行。

    附录:

    我将count()功能修改为

    count() {
        count=$(( $3 - $2 + 1 ))
        pattern=$(echo  "$1" | head -n $3 | tail -n $count)
        occur=$(echo "$1" | pcregrep -Mc "^\Q$(echo "$pattern")\E$")
        [ $occur -ge 2 ] && echo "$pattern occurs $occur times." >&2
        echo $occur
    }
    

    所以它打印重复到标准错误输出的模式。它说 10 行模式

    16
    ...
    16
    

    出现 360 次,而 10 线模式

    16
    ...
    16
    8
    

    出现两次。另一方面,9线模式

    16
    ...
    16
    

    出现 362 次,而

    16
    ...
    16
    8
    

    出现两次。您的文件包含许多带有16. 令我困惑的是,为什么16每个这样的块都不会再出现 9 行,而是总共 10 行的两倍多。

    • 1

相关问题

  • 从文本文件传递变量的奇怪问题

  • 虽然行读取保持转义空间?

  • `tee` 和 `bash` 进程替换顺序

  • 运行一个非常慢的脚本直到它成功

  • 如何更改字符大小写(从小到大,反之亦然)?同时[重复]

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve