我有一个包含 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
等,它只是将12M
和34M
作为字符串处理。
答案3
您尝试过使用 diff 吗?如果两个文件中的第一列都匹配,则该工具将非常适合。否则,您可以简单地获取第二列,然后将其与 diff 进行比较。您也可以在脚本中使用 diff。