我試圖從文件句柄打印重複行,而不是刪除它們或任何其他問題。我沒有足夠的perl經驗來快速做到這一點,所以我在這裏問。有什麼辦法做到這一點?Perl - 查找文件或數組中的重複行
回答
使用標準的Perl速記:
my %seen;
while (<>) {
print if $seen{$_}++;
}
作爲 「單行」:
perl -ne 'print if $seen{$_}++'
更多數據?這將打印<file name>:<line number>:<line>
:
%seen
perl -ne 'print ($ARGV eq "-" ? "" : "$ARGV:"), "$.:$_" if $seen{$_}++'
:
%seen
聲明哈希值。對於輸入中每個唯一的行(在這種情況下來自while(<>)
)$seen{$_}
將在由該行的文本命名的散列(這是{}
大括號中正在執行的操作)中具有標量槽。- 使用後綴增量運算符(
x++
)我們採取我們表達的價值,表達後記住要增量它。所以,如果我們還沒有「看到」$seen{$_}
行是未定義的 - 但是當強制進入像這樣的數字「上下文」時,它被視爲0-和false。 - 那麼它遞增到1
所以,當while
開始運行,所有線路都是「零」(如果它可以幫助你能想到的線路爲「不%seen
」),那麼,第一我們看到一條線的時間,perl
取未定義的值 - 這不符合if
- 並將標量插槽的計數增加到1.因此,對於未來發生的任何事件,它通過if
條件並將其打印爲1。
現在正如我上面所說的,%seen
聲明瞭一個散列,但是關掉strict
,任何變量表達式都可以在現場創建。所以第一次perl看到$seen{$_}
它知道我在尋找%seen
,它沒有它,所以它創建它。
對此的一個補充說明,最後,如果您喜歡使用它,您可以計算每行重複的次數。
試試這個
#!/usr/bin/perl -w
use strict;
use warnings;
my %duplicates;
while (<DATA>) {
print if !defined $duplicates{$_};
$duplicates{$_}++;
}
我會'打印,除非存在$ duplicates {$ _}'。對'-w'使用+1,'使用strict'和'使用警告'。 – Blrfl 2011-05-04 19:50:15
打印愚弄只有一次:
perl -ne "print if $seen{$_}++ == 1"
這就像'sort file.txt | uniq -d'(只能打印重複)在典型的Unix shell中。有沒有一個簡單的等價的'sort file.txt | uniq -u'(僅打印唯一行)? – 2013-07-15 21:07:00
- 1. Perl文件::查找重複名稱
- 2. 在文件中查找重複行並計算每行重複的行數?
- 3. 查找重複的文件
- 4. 在數組中查找高於或低於1的重複數
- 5. 查找重複數組
- 6. JavaScript數組 - 查找重複
- 7. 查找數組中的重複條目
- 8. 查找數組中的重複元素?
- 9. 查找數組中的重複元素
- 10. 查找Perl腳本重複模式和文件中出現的次數?
- 11. 查找重複的行組在Excel
- 12. 在數組中查找重複項
- 13. 如何在聯接文本文件中查找重複的行
- 14. Perl的重命名文件夾和文件文件::查找
- 15. 查找組重複計數的用戶
- 16. 使用Perl查找數組中的值
- 17. 查詢查找表中的重複行
- 18. 查找包含重複字符的文件中的行
- 19. PERL:重複行
- 20. VB.NET在文本文件中查找重複行
- 21. 在文本文件中查找重複行開頭
- 22. 如何查找2個不同文件中的重複行? Unix
- 23. 如何查找文件中的重複行?
- 24. Windows PowerShell來查找文件中重複的行
- 25. 查找文件中的第一條重複行
- 26. 在複雜的React組件中查找重複密鑰
- 27. 在數組中找到重複數組
- 28. 查找重複的圖像文件
- 29. C#FileInfo - 查找重複的文件
- 30. 如何查找位於多個文件中的行中重複的數字?
這在很大程度上取決於輸入的大小,線的尺寸和重複的潛在數量。如果內存要求很低,那麼帶有'%duplicates'哈希值的解決方案就足夠了。 – 2011-05-04 13:57:41
他們是。我只是使用文件句柄來快速檢查某些內容。它看起來沒有任何重複,所以這很好。 – Chris 2011-05-04 14:00:25