2016-06-08 51 views
0

我有以下的,它忽略了只用#而不是那些線條與\ N(空/只含換行線)AWK發現,如果行是換行或#

你知道的一種方法,我可以打兩隻一石二鳥? I.E.如果行不包含多於1個字符,則刪除該行。

function check_duplicates { 

awk ' 
    FNR==1{files[FILENAME]} 
     {if((FILENAME, $0) in a) dupsInFile[FILENAME] 
      else 
      {a[FILENAME, $0] 
      dups[$0] = $0 in dups ? (dups[$0] RS FILENAME) : FILENAME 
      count[$0]++}} 
       {if ($0 ~ /#/) { 
        delete dups[$0] 
       }} 
#Print duplicates in more than one file 
     END{for(k in dups) 
      {if(count[k] > 1) 
       {print ("\n\nDuplicate line found: " k) " - In the following file(s)" 
       print dups[k] }} 
     printf "\n"; 
     }' $SITEFILES 

awk ' 
NR { 
    b[$0]++ 
    } 
     $0 in b { 
      if ($0 ~ /#/) { 
      delete b[$0] 
         } 
        if (b[$0]>1) { 
        print ("\n\nRepeated line found: "$0) " - In the following file" 
        print FILENAME 
        delete b[$0] 
        } 
    }' $SITEFILES 

} 

預期的輸入通常如下。

#File Path's 
/path/to/file1 
/path/to/file2 
/path/to/file3 
/path/to/file4 



# 
/more/paths/to/file1 
/more/paths/to/file2 
/more/paths/to/file3 
/more/paths/to/file4 
/more/paths/to/file5 
/more/paths/to/file5 

在這種情況下,/ more/paths/to/file5會出現兩次,應該標記爲這樣。

但是,也有很多新行,我寧願忽略。

呃,它也必須awk中,我在做後期處理一噸,而不想從awk的變化時,該位,如果可以的話:)

這真的好像是比我預期的要強硬一點。

乾杯, 本

+1

順便說一下,您可能想要改進格式,以便您更輕鬆地遵循程序流程。 – 123

+1

另外,這是一個完整的程序,因爲你從來沒有看到設置dups數組或添加任何東西嗎?其實我無法弄清楚你在這個劇本中想要做什麼?你能發佈這個腳本應該解決的問題嗎? – 123

+0

以上更新。我想忽略#和\ n字符,不能讓\ n的人忽略不過。 –

回答

2

您可以結合兩個if成一個單一的正則表達式。

if ($0 ~ /#|\n/) { 
    delete dups[$0] 
} 

OR

更具體地講,你可以寫

if ($0 ~ /^#?$/) { 
    delete dups[$0] 
} 

它能做什麼

  • ^比賽開始行。

  • #?匹配線之一或零#

  • $匹配端。

所以,^$匹配空行和只有#^#$比賽線路。

+0

謝謝,寫得很漂亮,但它似乎並沒有在awk中工作。 –

+1

@BenCoughlan如果您可以包含包含和示例輸入以及期望的輸出,那麼人們會更容易回答。您提供的awk腳本似乎包含一些可以避免的額外行。 – nu11p01n73R

+0

輸入非常通用,但它在上面。 –