如果使用逗号分隔值不存在,则将内容附加到文件

时间:2016-04-19 13:36:12

标签: bash shell unix

我有一个名为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

有任何方法可以实现这一目标吗?或者你能建议我使用示例代码的另一种方法吗?

1 个答案:

答案 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