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
我什至不需要带有文件名的文件。
我有一个带有 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
我什至不需要带有文件名的文件。