读取和写入同一文件bash/unix
我有一个txt文件中列出的读取和写入同一文件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
键列表
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]+
正在进行?答案很好,不过对于我的用例,我确实需要它们有序,因为它们后来与值对关联。答案很好,但是对于我的用例,我确实需要它们有序,因为它们后来与值对关联。