我有一个名为file.txt
的文件,其中包含以下值
4
5
6
7
我将一些逗号分隔的值传递给上面的文件。
以下是我的命令:
filename="file.txt"
IFS=","
var="4,5"
for v in $var; do
while IFS= read -r line; do
if [[ $line == $v* ]]; then
printline="no"
else
printline="yes"
echo "$line"
fi
done < "$filename"
done
我希望上面的命令附加到一个新文件,如果它不存在我从变量传递的文件中的值。例如,我传递了4,5它存在于文件中。但是,它应该打印6,7,因为我没有传递这些值。
目前,循环以4号开头并打印5,6,7。然而,当循环再次以5号开始时,它打印出来,4,6,7。
上面的命令应该产生如下结果,不应该循环并再次打印数字。
6
7
有任何方法可以实现这一目标吗?或者你能建议我使用示例代码的另一种方法吗?
答案 0 :(得分:0)
为了测试以下解决方案,我根据您的问题( file.txt )创建了以下文件:
4
5
6
7
您可以执行:
$ grep -v $'4\n5' file.txt
6
7
虽然您似乎希望更多控制,但是 以下使用您的文件作为输入,参数“4,5”是硬编码的(您可能想要更改它)。它使用Bash 4中提供的Associative Array:
#!/bin/bash
# Usage: inarray "$value" "${array[@]}"
inarray() { local n=$1 h; shift; for h; do [[ $n = "$h" ]] && return; done; return 1; }
# The file which contains 4 5 6 7 separated by a new-line
source_file=$1
# Variables by you'd like to exclude.
var="4,5"
# Reading $var into an array
IFS=, read -ra vars <<< "$var"
# Reading $source_file values into an array.
mapfile -t numbers < "$1"
# An assoc array to hold the number which do not exist on $source_file
declare -A arr
for n in "${numbers[@]}"; do
# If the number does not exist in "${vars[@}}"
if ! inarray "$n" "${vars[@]}"; then
# Store that info on arr.
arr["$n"]=1
fi
done
printf '%s\n' "${!arr[@]}"
用法示例(脚本名称为 sof ):
$ ./sof file.txt
$ 6
$ 7