快速比较文本文件中的值

快速比较文本文件中的值

我有一个包含 2 列的文本文件,第一列是名称,第二列是时间值。喜欢:

cat  34M
dog  34M
fish 12M
ant  34M

我需要比较第二列的相同值,如果 1 与其余列不同,我想标记该条目。因此,在这种情况下,应该对鱼进行标记,因为它与其他鱼不同。该文件是动态的,并通过文件夹基础上的 for 循环进行更改,因此我的脚本应该在 for 循环中运行比较。

for FOLDER in is find ${DIR}/ -maxdepth 1 -type f -name values.txt`; do
<something to flag the 'odd' value>
done

我想我应该首先对第二列进行排序,然后将第一个(最高)值作为主要标记进行比较。该文件可能包含超过 1 个“奇数”值。该文件可以包含 2 到 500 个条目。我可以用子脚本或 awk 做一些事情,但我不知道从哪里开始。

谢谢你帮助我。

答案1

如果这些值适合内存,您的“最多 500”应该是这样,并且具体取决于您想要的内容,awk也许可以做到在一次传递中并且(至少大部分)在一个过程中。

列出出现过一次的任意值和所有值(如果有多个值),则按任意顺序:

awk '!n[$2++]{a[$2]=$1} END{for(v in n)if(n[v]==1)print a[v],v}'
# can pipe output to a suitable sort if you want a specific order
# or for GNU awk 4, you can get several non-arbitrary orders
# (less than GNU sort) using PROCINFO["sorted_in"] see the manual

列出出现一次的一个值(如果至少有一个):

awk '!n[$2++]{a[$2]=$1} END{for(v in n)if(n[v]==1){print a[v],v;exit}}'

列出出现一次的一个值,否则表明不存在:

awk '!n[$2++]{a[$2]=$1} END{for(v in n)if(n[v]==1){print a[v],v;exit};print "no unique entry"}'

答案2

一种方法是:

awk -v std="$( awk '{print $2}' file.txt | \
    sort | \
    uniq -c | \
    sort -rn | \
    awk 'NR==1 {print $2; exit}' )" '$2!=std' file.txt

内部的长命令$(...)确定最常见的时间值,而外部awk命令则选择第二列中具有不同值的所有条目。该脚本不考虑可能的时间“别名”,例如1M = 60S等,它只是将12M34M作为字符串处理。

答案3

您尝试过使用 diff 吗?如果两个文件中的第一列都匹配,则该工具将非常适合。否则,您可以简单地获取第二列,然后将其与 diff 进行比较。您也可以在脚本中使用 diff。

http://man7.org/linux/man-pages/man1/diff.1.html

相关内容