Linux 用于从CSV文件中删除重复项的Awk或Sed命令

Linux 用于从CSV文件中删除重复项的Awk或Sed命令,linux,shell,awk,sed,Linux,Shell,Awk,Sed,我有生成的CSV文件,其中包含重复的值。我想使用AWK或Sed命令删除/删除重复的值 实际产量 10.135.83.48,9042 10.135.83.46,9042 10.135.83.44,9042 10.5.197.25,10334 10.39.8.166,1500 10.135.83.48,9042 10.135.83.46,9042 10.135.83.44,9042 https://t-mobile.com,443 https://t-mobile.com,443 http://lo

我有生成的CSV文件,其中包含重复的值。我想使用AWK或Sed命令删除/删除重复的值

实际产量

10.135.83.48,9042
10.135.83.46,9042
10.135.83.44,9042
10.5.197.25,10334
10.39.8.166,1500
10.135.83.48,9042
10.135.83.46,9042
10.135.83.44,9042
https://t-mobile.com,443
https://t-mobile.com,443
http://localhost:5059/abc/token,80
预期产量

  10.135.83.48,9042
    10.135.83.46,9042
    10.135.83.44,9042
    10.5.197.25,10334
    10.39.8.166,1500
https://t-mobile.com,443
http://localhost:5059/abc/token,80
从几个属性文件中,我得到了这个输出。下面是我正在尝试的脚本

#!/bin/bash
for file in $(ls); 
do 
#echo  " --$file -- "; 
grep -P  '((?<=[^0-9.]|^)[1-9][0-9]{0,2}(\.([0-9]{0,3})){3}(?=[^0-9.]|$)|(http|ftp|https|ftps|sftp)://([\w_-]+(?:(?:\.[\w_-]+)+))([\w.,@?^=%&:/+#-]*[\w@?^=%&/+#-])?|\.port|\.host|contact-points|\.uri|\.endpoint)' $file|grep '^[^#]' |awk '{split($0,a,"#"); print a[1]}'|awk '{split($0,a,"="); print a[1],a[2]}'|sed 's/^\|#/,/g'|awk '/http:\/\//  {print $2,80}
       /https:\/\// {print $2,443}
       /Points/     {print $2,"9042"}
       /host/       {h=$2}
       /port/       {print h,$2; h=""}'|awk -F'[, ]' '{for(i=1;i<NF;i++){print $i,$NF}}'|awk 'BEGIN{OFS=","} {$1=$1} 1'|sed '/^[0-9]*$/d'|awk -F, '$1 != $2' 
done |awk '!a[$0]++' 
#echo "Done."
stty echo
cd ..
#/bin/bash
以美元(ls)表示的文件;
做
#echo“-$file--”;
grep-P'((?

Try

!/bin/bash
以*存档;
做
#echo“-$file--”;
grep-P'((?

Try

!/bin/bash
以*存档;
做
#echo“-$file--”;

grep-P'(?

实现这一点的最简单方法(或最简单的方法之一)是保留一个由已看到的记录索引的数组。如果记录不在

seen
数组中,则添加它并打印该记录。如果是,则跳过该记录,例如

awk '$0 in seen{next}; {seen[$0]++}1' file
示例使用/输出

在名为
dupes
的文件中输入后,您将有:

$ awk '$0 in seen{next}; {seen[$0]++}1' dupes
10.135.83.48,9042
10.135.83.46,9042
10.135.83.44,9042
10.5.197.25,10334
10.39.8.166,1500
https://t-mobile.com,443
http://localhost:5059/abc/token,80

实现这一点的最简单方法(或最简单的方法之一)是保留一个由已看到的记录索引的数组。如果记录不在
seen
数组中,则添加并打印该记录。如果是,则跳过该记录,例如

awk '$0 in seen{next}; {seen[$0]++}1' file
示例使用/输出

在名为
dupes
的文件中输入后,您将有:

$ awk '$0 in seen{next}; {seen[$0]++}1' dupes
10.135.83.48,9042
10.135.83.46,9042
10.135.83.44,9042
10.5.197.25,10334
10.39.8.166,1500
https://t-mobile.com,443
http://localhost:5059/abc/token,80
这可能适用于您(GNU-sed):

将当前行附加到保留空间(HS),如果它是重复的,则将其删除

在文件末尾,切换到HS,删除第一个字符(这是换行符工件)并打印结果

注意:这将删除重复项,但保留原始顺序。

这可能适用于您(GNU-sed):

将当前行附加到保留空间(HS),如果它是重复的,则将其删除

在文件末尾,切换到HS,删除第一个字符(这是换行符工件)并打印结果


注意:这会删除重复项,但保留原始顺序。

这应该在循环中。我很想看看实际输入文件的格式……在我看来,有大量的grepping和awking正在进行……如果顺序不重要,只需
排序-u
就可以了,顺便说一句,
对于$(ls)中的文件
不要这样做。对*中的文件使用
更多信息,请参阅。这应该在循环中。我很想看看实际输入文件的格式……在我看来,有很多的灰色和灰色正在进行……如果顺序不重要,只需对$(ls)中的文件使用
排序-u
即可
不要这样做。请对*中的文件使用
有关详细信息,请参阅。