簡體   English   中英

用於從 CSV 文件中刪除重復項的 awk 或 Sed 命令

[英]Awk or Sed commands to remove duplicates from the CSV file

我確實有生成的 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 ..

awk '!a[$0]++' --> 這是我試圖與上述腳本結合使用的命令。 單獨這個命令是有效的。但是當我試圖與上面的腳本結合時,它沒有按預期工作。

提前感謝您的幫助。

嘗試

#!/bin/bash
for file in *; 
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' | awk '!a[$0]++'  
done 
#echo "Done."
stty echo
cd ..

解決這個問題的最簡單的方法(或最簡單的方法之一)是保留一個由已經看到的記錄索引的數組。 如果記錄不在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):

sed -E 'H;x;s/((\n[^\n]+)(\n.*)*)\2$/\1/;x;$!d;x;s/.//' file1

將當前行附加到保留空間 (HS),如果它是重復的,則將其刪除。

在文件的末尾,交換到 HS,刪除第一個字符(這是一個換行符)並打印結果。

注意這會刪除重復項但保留原始順序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM