2010-05-26 49 views
2

我有一個文件,其中有一些行由「|」分隔的行。根據行上的一些分隔文件找到重複行

我要提取基於一些的Fileds的 是相同的線(即發現其包含字段1,2,3 12相同的值的行,和13) 其它字段內容具有用於搜索沒有重要性但是整個提取的行必須完整。

誰能告訴我怎麼在KSH腳本中做到這一點 (通過一些腳本來定義文件的分隔符和必須進行比較以在輸入文件中查找重複行的字段)

在此先感謝和親切的問候

奧利

+0

它可以幫助您顯示目前爲止的腳本以及一些示例數據。另外,是否要丟棄(不打印)沒有重複項的行並打印所有重複的行?或者是否僅打印符合一組標準的行? – 2010-05-26 13:08:38

回答

2

這版畫複製基於匹配字段行。它使用一個關聯數組,它可以根據輸入文件的性質變大。輸出沒有排序,因此大多數副本沒有組合在一起(除了一組的前兩個)。

awk -F'|' '{ idx=$1$2$3$12$13; if (array[idx] == 1) {print} else if (array[idx]) {print array[idx]; print; array[idx]=1} else {array[idx]=$0}}' inputfile.txt 

你也許可以建立你的索引列表中shell變量在一個包裝腳本是這樣的:

#!/bin/ksh 
for arg 
do 
    case arg in # validate input (could be better) 
     +([0-9])) # integers only 
      idx="$idx'$'$arg" 
      ;; 
     *) 
      echo "Invalid field specifier" 
      exit 
      ;; 
    esac 
done 
awk -F'|' '{ idx='$idx'; if (array ... 

您可以通過一個命令管道是像這樣的輸出進行排序:

awk ... | sort --field-separator='|' --key=1,1 --key=2,2 --key=3,3 --key=12,12 --key=13,13 
-1

打印其被複制線 - 每個只有一行:

awk -F'|' '!arr[$1$2$3$12$13]++' inputfile > outputfile 
+0

這是不同的SO問題/答案的變體:[Grep只是其中一個部分重複](http://stackoverflow.com/questions/21929071/grep-only-one-of-partial-duplicates)。它的行爲的確是清除重複的東西,但這意味着在這種情況下:將任何重複的原始文件都留下; *還*留下任何沒有重複的行。所以輸出文件將包含很多誤報。 – 2014-10-22 08:29:28

相關問題