Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.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
多字段bash排序和重复数据消除_Bash_Shell_Unix - Fatal编程技术网

多字段bash排序和重复数据消除

多字段bash排序和重复数据消除,bash,shell,unix,Bash,Shell,Unix,我想先在第一个字段中对如下内容的数据进行排序,然后在第三个字段中对日期进行排序。然后,仅保留每个ID的最新值(字段1)-与第二个字段无关 id1,description1,2013/11/20 id2,description2,2013/06/11 id2,description3,2012/10/28 id2,description4,2011/12/04 id3,description5,2014/02/09 id3,description6,2013/12/05 id4,descripti

我想先在第一个字段中对如下内容的数据进行排序,然后在第三个字段中对日期进行排序。然后,仅保留每个ID的最新值(字段1)-与第二个字段无关

id1,description1,2013/11/20
id2,description2,2013/06/11
id2,description3,2012/10/28
id2,description4,2011/12/04
id3,description5,2014/02/09
id3,description6,2013/12/05
id4,description7,2013/12/05
id5,description8,2013/08/14
因此,预期的产出将是

id1,description1,2013/11/20
id2,description2,2013/06/11
id3,description5,2014/02/09
id4,description7,2013/12/05
id5,description8,2013/08/14
谢谢 Jomon试试这个:

cat file |sort -u|awk -F, '{if(map[$1] == ""){print $0; map[$1]="printed"}}'
说明

我使用
sort
进行排序(再简单不过了)

如果已经打印了第一列项目,我就使用awk存储在地图中

如果不是(map[$1]==“”),我将“printed”打印并存储到map[$1](因此下次对于当前值$1,它将不等于“”。

您可以使用此awk:

> cat file
id1,description1,2013/11/20
id1,description1,2013/11/19
id2,description2,2013/06/11
id2,description3,2012/10/28
id2,description4,2011/12/04
id3,description5,2014/02/09
id3,description6,2013/12/05
id4,description7,2013/12/05
id5,description8,2013/08/14

> sort -t, -k1,1 -k3,3r file | awk -F, '!a[$1]++'
id1,description1,2013/11/20
id2,description2,2013/06/11
id3,description5,2014/02/09
id4,description7,2013/12/05
id5,description8,2013/08/14

调用
sort
两次;第一次,按日期排序。在第二次调用中,在第一个字段上进行唯一排序,但要稳定地进行排序,以便具有相同id的项目仍按日期排序

sort -t, -k3,3r data.txt | sort -t, -su -k1,1

使用
sort
对其进行排序,并使用
awk
对结果进行重复数据消除。我没有对您的另一个答案这样说,我觉得我必须这样说:您的做法恰好为给定输入生成了正确的答案。例如,将
id1,description12013/11/19
添加到输入的第2行,观察得到的结果。如果我在记录#2处插入
id1,description12013/11/19
,那么在输出中它会显示
id1,description12013/11/19
作为第一条记录。这正是它不正确的原因。所需输出应包含最新日期,即应为
2013/11/20
,而不是
2013/11/19
。(假设我的问题是正确的)awk阵列的使用很好,今天我学到了一些非常有用的东西!它工作得很好!我有一个6000多行的数据文件。。。从我检查的随机10-20条输出线来看,一切都正常。非常感谢!可能从未出现过可以将
-u
-k
结合使用的情况。好极了在理想情况下,
sort-t,-k3,3r-k1,1u data.txt
可以工作。