Bash 检查 file1 行是否部分包含在 file2 的行中

Bash check if file1 line is partly contained in a line from file2

我有一个带有 ID 的文件 1 和一个包含文件夹中所有文件全名的列表的文件 2。

文件 1 中的 ID 如下所示 P001A、P001I、P002A、P002I ... file2 中的文件名本身就包含这些 ID。我想创建一个新的 file3,其中包含 file2 中具有 file1 中的 ID 的所有全名。

文件 2 大约有 10 万行,而文件 1 有 89 行,因此文件 2 中有许多行包含与文件 1 中的行相同的 ID。

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

FILE1: command not found FILE2: command not found -bash: ${FILE1}: ambiguous redirect

  1#!/bin/sh
  2 FILE1 =""
  3 FILE2 =""
  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

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

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

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

FILE1=""
FILE2=""
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=""
FILE2=""
(while read -r value1
do
    (while read -r value2
    do
        if [[ -z "${value2##*$value1*}" ]]
            then
            echo $value2
        fi
done) < ${FILE2}
done <${FILE1}) > file3.list

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

  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

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