2015-06-30 87 views
1

我正在循環訪問txt文件中的製表符分隔的行。這個txt文件是一個xml/xslt過程的輸出並且有重複。下面我正在尋找一個txt文件的解決方案,但使用XSLT的解決方案也同樣讚賞。請參閱示例txt文件。使用Bash循環訪問txt文件中的唯一行

txtfile.txt:3號線是線的副本1

[email protected] running 1111 
[email protected] running 9876 
[email protected] running 1111 
[email protected] shutdown 1234 
[email protected] running 9876 
[email protected] running 1111 

我的問題是:可以複製線在一個循環,這樣的循環僅處理獨特的線條被跳過?在這種情況下,如何配置循環第1,2,4行和跳過第3,5,6行?

我當前的工作循環讀取重複:

while read name status num 
do 
    echo "<tag1>" 
    echo "<tag2>"$name"</tag2>" 
    echo "<tag3>"$status"</tag3>" 
    echo "<tag2>"$num"</tag2>" 
    echo "</tag1>" 

done < txtfile.txt 

在我txtfile有數百行和近一半是重複的,所以這是一個巨大的問題,對我來說!任何想法/解決方案讚賞。提前致謝。

+1

可能是由像'<某物使用排序的唯一列表(貓txtfile.tx |排序| uniq的)'。 –

回答

2

您可以通過sort -u讀取該文件以消除重複的行:

sort -u /your/file | while read ... 
2

我會建議使用AWK:

$ awk '!a[$0]++{print "<tag1>\n<tag2>" $1 "</tag2>\n<tag3>" $2 "</tag3>\n<tag2>" $3 "</tag2>\n</tag1>"}' file 
<tag1> 
<tag2>[email protected]</tag2> 
<tag3>running</tag3> 
<tag2>1111</tag2> 
</tag1> 
<tag1> 
<tag2>[email protected]</tag2> 
<tag3>running</tag3> 
<tag2>9876</tag2> 
</tag1> 
<tag1> 
<tag2>[email protected]</tag2> 
<tag3>shutdown</tag3> 
<tag2>1234</tag2> 
</tag1> 

條件!a[$0]++計算結果爲true首次每一行之後看到和虛假。當條件成立時,輸出被打印。

基本原理是行$0的內容被用作數組a中的鍵。如果記錄之間的間距可能有所不同,則可以使用!a[$1,$2,$3]++,只要3個字段相同,不管它們之間的間距如何,都會將行數統計爲相同。

+1

偉大的解決方案!完美的工作......儘管如果我可以用另一種方式去編寫/編輯廣泛的awk命令,我有點懶惰(按Costi發佈排序-u)。當我有15代表的能力時,我肯定會投票。 – Alan