【问题标题】:Bash check if file1 line is partly contained in a line from file2Bash 检查 file1 行是否部分包含在 file2 的行中
【发布时间】:2020-11-19 14:10:13
【问题描述】:

我有一个带有 id 的 file1 和一个 file2,它是一个包含文件夹中所有文件全名的列表。

来自 file1 的 ID 看起来像这样 P001A、P001I、P002A、P002I ... 并且来自 file2 的文件的名称本身就包含这些 id。我想创建一个新的 file3,其中包含来自 file2 的所有全名,这些全名具有来自 file1 的 id。

File2 大约有 100k 行,而 file1 有 89 行,因此 file2 中有许多行包含与 file1 中的行相同的 id。

这是我正在使用的脚本,但它说

FILE1:未找到命令 FILE2:未找到命令 -bash: ${FILE1}: 不明确的重定向

  1#!/bin/sh
  2 FILE1 ="$1"
  3 FILE2 ="$2"
  4 while read -r value1
  5 do
  6     while read -r value2
  7     do
  8         if [[ "$value1" == *"$value2"* ]]
  9             then
 10             echo $value2
 11         fi
 12     done <${FILE2}
 13 done <${FILE1} > file3.list

这里有什么问题?你知道那个脚本应该是这样还是我应该做一些其他的方式。

【问题讨论】:

  • 看看shellcheck.net,它会告诉你很多常见的错误。马上开始:你使用/bin/sh,然后你使用[[ ... ]],一个Bashism;切换到case 进行模式匹配,或使用/bin/bash(或/usr/bin/env bash)。然后,您对FILE1FILE2 的分配不得在= 周围包含空格。最后,这会非常慢,你可以用grep -Ff "$FILE2" -- "$FILE1" 做同样的事情。
  • 您能否添加一些从两个文件中提取的示例以及预期的输出。
  • @BenjaminW。什么使 -Ff 选项? @ Raman Sailopal file2 例如文件从 P001A0001 到 P001A0120,而在 file1 中只有 P001A,我想将所有包含 P001A id 的文件存储在第三个文件中。
  • @PetarYakov:请从两个相关文件中添加示例数据
  • -F, -f

标签: bash file iteration contains


【解决方案1】:

正如@Benjamin 所说-您使用 /bin/sh 但使用“[[”和“]]”进行测试。 我重写了您的代码以使用 /bin/sh:

#!/bin/sh
is_substring(){
    case "$2" in
        *$1*) return 0;;
        *) return 1;;
    esac
}

FILE1="$1"
FILE2="$2"
while read -r value1
do
    while read -r value2
    do
        if is_substring "$value1" "$value2"
            then
            echo $value2
        fi
    done <${FILE2}
done <${FILE1} > file3.list

对于 bash:

#!/bin/bash
FILE1="$1"
FILE2="$2"
(while read -r value1
do
    (while read -r value2
    do
        if [[ -z "${value2##*$value1*}" ]]
            then
            echo $value2
        fi
done) < ${FILE2}
done <${FILE1}) > file3.list

【讨论】:

  • 哦,我错了,我应该使用/bin/bash。那么语法是什么?
【解决方案2】:

我用这个脚本解决了我的问题

  1#!/bin/bash
  2 for i in $(cat file1);
  3 do
  4    FILENAME=$(find /directory/ -regextype posix-egrep -regex ".*/20170001${i}[0-9]*\.wav")
  5    echo "${FILENAME}";
  6 done > file3

我什至不需要带有文件名的文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多