读取和写入同一文件bash/unix

读取和写入同一文件bash/unix,bash,unix,recursion,Bash,Unix,Recursion,我有一个txt文件中列出的键列表 sample.txt 住址 联系电话号码 创建于 创建者id 自定义字段 住址 联系电话号码 电话 名称 电子邮件 名称 我有下面的递归脚本,可以删除重复项 #!/bin/bash function keyChecker(){ if grep -q $i uniqueKeys.txt; then echo "Duplicate Key: ${i}" else echo $i >> uniqueKeys

我有一个txt文件中列出的
键列表

sample.txt

住址
联系电话号码
创建于
创建者id
自定义字段
住址
联系电话号码
电话
名称
电子邮件
名称

我有下面的递归脚本,可以删除重复项

#!/bin/bash
function keyChecker(){
    if grep -q $i uniqueKeys.txt; then
        echo "Duplicate Key: ${i}"
    else
        echo $i >> uniqueKeys.txt
         echo "New key: ${i}"
    fi
}

function recursiveDoer(){
    for i in $(cat keys.txt); do
        keyChecker $i
    done
recursiveDoer
}
touch uniqueKeys.txt
counter=0
recursiveDoer
此代码将向
uniqueKeys.txt

一旦不再有重复项,这些方法将发送到无限循环中。我写的每个递归方法都会遇到这个问题。我通常通过添加一个计数器来作弊,该计数器在一个任意大的数字(如
10000
)之后强制退出1

  • 使用递归和无无限循环编写此方法的正确方法是什么

  • 这可以简化并在单个循环中作为非递归方法编写吗


  • awk
    救援

    awk
    magic将仅以相同顺序打印唯一条目

    awk '!a[$0]++' file
    
    您可以使用此习惯用法覆盖输入文件

    awk '!a[$0]++' file > temp && mv temp file
    
    这可能会复制您的代码

    awk '!a[$0]++ {print "New key: " $0;
                   print > "uniqueKeys.txt"
                   next}
                  {print "Duplicate Key: " $0}' file
    
    解释

    a[$0]
    在关联映射
    a
    中为读取行创建一个条目作为键<代码>++强制将空值视为0并递增<代码>强制将该值视为布尔值并将其取反。综上所述,只有在第一次看到密钥时才是真的,因此可以有效地消除文件中的重复行


    awk
    救援

    awk
    magic将仅以相同顺序打印唯一条目

    awk '!a[$0]++' file
    
    您可以使用此习惯用法覆盖输入文件

    awk '!a[$0]++' file > temp && mv temp file
    
    这可能会复制您的代码

    awk '!a[$0]++ {print "New key: " $0;
                   print > "uniqueKeys.txt"
                   next}
                  {print "Duplicate Key: " $0}' file
    
    解释

    a[$0]
    在关联映射
    a
    中为读取行创建一个条目作为键<代码>++强制将空值视为0并递增<代码>强制将该值视为布尔值并将其取反。综上所述,只有在第一次看到密钥时才是真的,因此可以有效地消除文件中的重复行


    如果你不在乎钥匙的顺序,你可以简单地使用


    sort-u keys.txt>uniqueKeys.txt

    如果您不关心键的顺序,只需使用即可


    sort-u keys.txt>uniqueKeys.txt

    这里不需要递归。移除函数内部的调用,for循环检查所有键,这就是结束。实际上这不是真的,如果这样做,您会发现它会将所有键视为新键。我相信这是由于没有关闭文件造成的。需要进一步的测试这里确实不需要递归函数。但是,您应该将
    keychecker
    中的
    $i
    的两个实例都更改为
    $1
    (或者更好地更改为
    “$1”
    ),因为您显然希望
    keychecker
    检查其参数。(也在回显字符串中。
    ${i}
    是不必要的;只需使用
    $1
    )rici,这些注释实际上对我的问题没有帮助。你所做的只是描述一种不同的方式来引用我的论点。。。。您没有解决递归问题。请保留对递归问题的注释这就是为什么它是注释而不是答案:)然而,“递归是不必要的”实际上是一个准确的陈述。文件在迭代之间不保持打开状态。这里不需要递归。移除函数内部的调用,for循环检查所有键,这就是结束。实际上这不是真的,如果这样做,您会发现它会将所有键视为新键。我相信这是由于没有关闭文件造成的。需要进一步的测试这里确实不需要递归函数。但是,您应该将
    keychecker
    中的
    $i
    的两个实例都更改为
    $1
    (或者更好地更改为
    “$1”
    ),因为您显然希望
    keychecker
    检查其参数。(也在回显字符串中。
    ${i}
    是不必要的;只需使用
    $1
    )rici,这些注释实际上对我的问题没有帮助。你所做的只是描述一种不同的方式来引用我的论点。。。。您没有解决递归问题。请保留对递归问题的注释这就是为什么它是注释而不是答案:)然而,“递归是不必要的”实际上是一个准确的陈述。该文件在迭代之间未保持打开状态。请澄清是什么
    !一个[$0]+
    正在做什么?请你澄清一下
    是什么!一个[$0]+
    正在进行?答案很好,不过对于我的用例,我确实需要它们有序,因为它们后来与值对关联。答案很好,但是对于我的用例,我确实需要它们有序,因为它们后来与值对关联。