【发布时间】:2019-12-07 23:28:57
【问题描述】:
下面的script.sh 将字符串的一部分(来自stdin 由cat 写入csv 文件)与定义的字符串进行比较,并以某种格式报告差异
#!/usr/bin/env bash
reference="ABCDEFG"
ref_transp=$(echo "$reference" | sed -e 's/\(.\)/\1\n/g')
while read line; do
line_transp=$(echo "$line" | cut -d',' -f2 | sed -e 's/\(.\)/\1\n/g')
output=$(paste -d ' ' <(echo "$ref_transp") <(echo "$line_transp") | grep -vnP '([A-Z]) \1' | sed -E 's/([0-9][0-9]*):([A-Z]) ([A-Z]*)/\2\1\3/' | grep '^[A-Z][0-9][0-9]*[A-Z*]$')
echo "$(echo ${line:0:35}, $output)"
done < "${1:-/dev/stdin}"
它打算在格式非常大的文件中的多行上执行
XYZ,ABMDEFG
当我在管道中使用它时效果很好:
cat large_file | ./find_something.sh
但是,当我尝试将它与 parallel 一起使用时,我收到此错误:
$ cat large_file | parallel ./find_something.sh
./find_something.sh: line 9: XYZ, ABMDEFG : No such file or directory
这是什么原因造成的?如果我想之后将输出重定向到单个文件,parallel 应该适用于这样的事情吗?
不太重要的旁注:我对我的字符串比较方法感到相当自豪,但如果有人有更快的方法来比较 ABCDEFG 和 XYZ,ABMDEFG 以获得 XYZ,C3M 我很高兴听到,也是。
编辑:
我应该说,我还想保留输出中每一行的顺序,对应输入。是否可以使用并行?
【问题讨论】:
-
请编辑您的 Q 以显示来自示例输入的所需输出。还请包括
reference的示例数据和您正在使用的任何其他静态数据。祝你好运。 -
考虑在顶部使用“set -x”来运行您的脚本。您将获得有助于调试问题的信息。另外,请将带有 XYZ、ABMDEFG 的行(和其他一些好的行)发布,以便可以复制
-
据我所知,您每行运行大约 10 个外部进程,
cut、sed、grep、paste等等。大概您想使用 GNU Parallel 来加快速度。我不禁想到你会做得更好,以显示输入和所需的输出,并在一个awk脚本中完成所有工作。
标签: bash parallel-processing string-comparison large-files