Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在使用linux shell时过滤多个文件并消除重复条目以选择单个条目_Linux_Shell - Fatal编程技术网

如何在使用linux shell时过滤多个文件并消除重复条目以选择单个条目

如何在使用linux shell时过滤多个文件并消除重复条目以选择单个条目,linux,shell,Linux,Shell,我有一个包含多个文件的文件夹。这些文件由相同的列组成。 假设file1和file2的内容如下所示(这里可以有两个以上的文件) 在我的文件中,第一列是手机号码,第二列是计数。同一手机可以存在多个文件中。现在我想把这些记录放入一个具有唯一手机号码的文件中,该号码的计数最高。 输出应如下所示: $cat output.txt 7777777777|1289 8888888888|2450 6666666666|2788 9999999999|3000 2222222222|3001 任何帮助都将不

我有一个包含多个文件的文件夹。这些文件由相同的列组成。 假设file1和file2的内容如下所示(这里可以有两个以上的文件)

在我的文件中,第一列是手机号码,第二列是计数。同一手机可以存在多个文件中。现在我想把这些记录放入一个具有唯一手机号码的文件中,该号码的计数最高。 输出应如下所示:


$cat output.txt
7777777777|1289
8888888888|2450
6666666666|2788
9999999999|3000
2222222222|3001


任何帮助都将不胜感激。

这可能不是很有效,但它确实起到了作用: 将其放入phones.sh并运行
sh phones.sh

#!/bin/bash
files="
file1.txt 
file2.txt
"
phones=$(cat $files | cut -d'|' -f1 | sort -u)
for phone in $phones; do grep -h $phone $files | sort -t'|' -k 2 -nr | head -n1; done | sort -t'|' -k 2

它所做的基本上是,提取文件中的所有电话号码,对它们进行迭代,并在所有文件中对它们进行grep,然后选择计数最高的一个。然后我还按计数对最终结果进行排序,这就是您预期的结果
sort-t'|'-k2-nr
表示通过降低数字顺序对给定分隔符的第二列进行排序
head-n1
选择第一行。您可以将其他文件添加到
files
变量中。

这可能不是很有效,但它可以完成以下工作: 将其放入phones.sh并运行
sh phones.sh

#!/bin/bash
files="
file1.txt 
file2.txt
"
phones=$(cat $files | cut -d'|' -f1 | sort -u)
for phone in $phones; do grep -h $phone $files | sort -t'|' -k 2 -nr | head -n1; done | sort -t'|' -k 2

它所做的基本上是,提取文件中的所有电话号码,对它们进行迭代,并在所有文件中对它们进行grep,然后选择计数最高的一个。然后我还按计数对最终结果进行排序,这就是您预期的结果
sort-t'|'-k2-nr
表示通过降低数字顺序对给定分隔符的第二列进行排序
head-n1
选择第一行。您可以将其他文件添加到
files
变量中。

另一种方法是使用
sort
awk
的功能:

cat file1.txt file2.txt | sort -t '|' -k1,1 -k2,2nr | awk -F"|" '!_[$1]++' | sort -t '|' -k2,2n

我认为,除了
awk
之外,一行代码是非常不言自明的。该部分所做的是在第一列执行
uniq
。最后一次排序只是为了得到您想要的最终订单。

另一种方法是使用
排序和
awk
的功能:

cat file1.txt file2.txt | sort -t '|' -k1,1 -k2,2nr | awk -F"|" '!_[$1]++' | sort -t '|' -k2,2n

我认为,除了
awk
之外,一行代码是非常不言自明的。该部分所做的是在第一列执行
uniq
。最后一种排序只是为了得到您想要的最终顺序。

将您到目前为止所做的事情放在这里将您到目前为止所做的事情放在这里我想用ls-ltrh来代替文件名,我想一个接一个地对文件进行排序,而不是一次对所有文件进行排序。。。。首先我想对前2个文件进行排序并放入新文件,然后我想对第3个文件和新文件进行排序并放入同一个新文件,然后对第4个文件进行排序并放入新文件…等等,最后我想要一个已排序的新文件。请帮助我很难理解您真正想要的是什么,但我认为您可以开始学习shell脚本的基础知识。我想我的答案不需要太多修改就可以达到你所需要的。顺便说一句您应该改用
find
。我想用ls-ltrh代替文件名,并且我想一个接一个地对文件排序,而不是一次对所有文件排序。。。。首先我想对前2个文件进行排序并放入新文件,然后我想对第3个文件和新文件进行排序并放入同一个新文件,然后对第4个文件进行排序并放入新文件…等等,最后我想要一个已排序的新文件。请帮助我很难理解您真正想要的是什么,但我认为您可以开始学习shell脚本的基础知识。我想我的答案不需要太多修改就可以达到你所需要的。顺便说一句您应该使用
find