【问题标题】:Comparing numbers in a text file to a list of numbers in an other textfile将文本文件中的数字与另一个文本文件中的数字列表进行比较
【发布时间】:2014-04-10 07:53:18
【问题描述】:

我有一个包含 4 位数字的 .txt 文件。

有时它们只包含一个 4 位数字,有时它们包含多个 4 位数字,有时它们是空的。

example1.txt 文件:

6304
6204

example2.txt 文件:

6308

example3.txt 文件:

6305

example4.txt 文件:

6300
6204
6301

example5.txt 文件:

6302
6234
6345

我需要做的是检查示例文件中的数字是否在我在其他文本文件中的数字列表中。

这个列表看起来像这样:(但有更多的数字

6300 
6301 
6302 
6303 
6304 
6305

*对于“example1.txt”文件:

应该从文件中删除数字“6204”*(因为它不在列表中。)* 数字“6304”必须保留在示例文件中(它在列表中)

*对于“example2.txt”文件:

号码应该被删除,文件应该是空的。

*对于“example3.txt”文件:

数字保留在示例文件中。

*对于“example4.txt”文件:

示例文件中有超过 1 个匹配项。所以应该删除所有内容。

*对于“example5.txt”文件:

文件中应该只有 6302。另外两个应该删除,因为它们不在列表中。


所以基本上我想保留只有 1 个匹配项的文件。并且这些文件应该只包含与列表中的数字匹配的数字。如果匹配项超过 1 个,则文件应为空。如果没有匹配的文件也应该是空的

除此之外,我想在 sh 脚本中完成。

现在我的问题是:

这是否可能以及如何实现?还是我需要使用数据库和其他编程语言?

提前致谢。

【问题讨论】:

  • 你说你有“一个文本文件”然后你说“它们包含一个或两个或没有数字”。你有多少个文本文件?你的“其他”文件叫什么 - 列表之一?
  • 如果文件中有3个数字并且都与列表匹配怎么办?你还没有具体说明接下来会发生什么。
  • 文本文件的数量是可变的。但我知道如何在脚本中处理它。确实有可能有 3 个数字甚至更多。但大多数情况下它只会包含 1 个数字。有时 2 个数字很少更多......在多个匹配的情况下,它们都应该被删除。只允许一场比赛。对于列表文件,我们只需将其命名为 list.txt 或其他东西:) 我仍然需要制作它。
  • 示例 5 说“3204”应该保留在文件中 - 它甚至不在文件中开始!

标签: linux database bash shell scripting


【解决方案1】:

我想我现在已经理解你的逻辑了。我假设您的列表存储在文件list.txt 中,并且您将以下内容另存为marksscript

#!/bin/bash
#
# First count total number of matches and store in variable MATCHES
#
MATCHES=0
while read WORD
do
   # Count number of matches for this word
   N=$(grep -c $WORD list.txt)
   [ $N -eq 1 ] && MATCHEDWORD=$WORD
   echo DEBUG: $WORD $N
   ((MATCHES+=N))
done < "$1"

#
# Now we know total number of matches, decide what to do
#
echo DEBUG: Total matches $MATCHES

if [ $MATCHES -ne 1 ]; then
    echo DEBUG: Zero out file - not exactly ONE match
    > "$1"
else
    echo DEBUG: $MATCHEDWORD remains as singleton match
    echo $MATCHEDWORD > "$1"
fi

像这样运行:

chmod +x marksscript
./marksscript example1.txt

输出

./go example1
DEBUG: 6204 0
DEBUG: 6304 1
DEBUG: Total matches 1
DEBUG: 6304 remains as singleton match

./go example2
DEBUG: Total matches 0
DEBUG: Zero out file - not exactly ONE match

./go example3
DEBUG: 6305 1
DEBUG: Total matches 1
DEBUG: 6305 remains as singleton match

./go example4
DEBUG: 6300 1
DEBUG: 6204 0
DEBUG: 6301 1
DEBUG: Total matches 2
DEBUG: Zero out file - not exactly ONE one match

【讨论】:

  • 太棒了!我明天上班检查一下,让你知道结果。
  • 如果我的示例文件包含 1 个数字并且该数字在列表中,则该数字将保留在示例文件中。所以在这种情况下它可以工作。如果文件中的数字不在列表中。那么该数字也保留在示例文件中。在这种情况下,应该删除该数字。如果 example1.txt 包含一个列表中的数字和 1 个不在列表中的数字。两者都被删除,在这种情况下,列表中的那个应该保留在文件中,而不是列表中的数字应该被删除。我真的不知道如何改变你的脚本来得到我需要的东西??谢谢
  • 当然,如果示例文件中有多个匹配项,则应将它们全部删除。抱歉我回复晚了,但我还有其他工作要做。
  • 我在我的问题中添加了一些例子来说明问题:)
  • 您的长评论没有意义。您说“如果有一个数字并且它在列表中,它会保留在文件中。如果有一个数字并且它不在列表中,它也会保留”。因此,如果该数字在列表中,则完全无关紧要。然后你说“如果一个文件包含一个列表中的数字和一个不在列表中的数字,则两者都会被删除,一个应该保留,一个应该被删除”。我不明白你想要什么!
【解决方案2】:

这当然不是最快的解决方案,但有效:

while read line
do 
    sed -i "s/$line//" example1.txt
done < list_textfile.txt

它会从“要检查的数字”文本文件中删除每行中字符串的所有外观。

更新: 这不是所要求的:上面过滤掉了 list_textfile.txt 中的字符串,而不是保留它们。

这应该做正确的事:

grep -o -f list_textfile.txt example1.txt
  • -o 确保只有匹配的部分显示在输出中
  • -f 允许指定一个文件,其中包含要 grep 的字符串

【讨论】:

  • 这不处理两个号码都在列表中并且必须都删除的情况。
  • 您好,感谢您的回复。它很接近,但恰恰相反。现在列表中的数字被删除。我只需要保留列表中的数字。
  • 对我来说确实如此。我将6304 6204 放入example1.txtlist_textfile.txt 包含独立行中的每个数字。这两个值都从 example1.txt 中删除
  • 确实如此,它会删除列表中的数字。但我需要保留列表中的数字,其余的应该删除。 (这是优先级)。当有多个匹配项时删除文件中的所有内容将是一个很好的额外。
猜你喜欢
  • 2018-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-22
  • 1970-01-01
  • 2015-06-22
  • 1970-01-01
相关资源
最近更新 更多