2014-03-19 38 views
0

我有一個包含數百萬行的csv文件。現在很少的行包含更多的數據,然後列數據類型可以容納。對於例如CSV文件只有兩行,如下圖所示,請不^ _爲分隔符如何在linux的csv文件中找到最長的列(因此是行)?

A^_B^_C 
AA^_BB^_CC 

現在假設每一行,以便行1列1是正確的,但2號線是不是可以容納只有一個字符,我想找出所有這些種類的線。

所以我想,如果我從csv文件最長行我會好的,我想以下,但並沒有幫助(從longest line

wc -L file 

請幫我找到最大的行/列一個csv文件。另一個問題是我有兩個分隔符,所以也不能使用cut命令。

+0

你有兩個分隔符?我只在樣本數據中看到'',''。 –

+0

嗨@jaypal請參閱帶分隔符的編輯問題。 – u449355

回答

3

你可以嘗試這樣的:

awk ' 
{ 
for(i=1;i<=NF;i++) 
    if (length($i) == good) { continue } 
    else { 
     print "Row "NR" contained data more than " good" in a single field" 
     next 
    } 
    print "Row "NR " is valid" 
}' FS='\\^_' good="1" csv 
Row 1 is valid 
Row 2 contained data more than 1 in a single field 

說明:

  • 我們設置字段分隔符\\^_(注意,我們需要轉義^,因爲它是一個特殊的字符)。
  • 我們遍歷每個字段
  • 我們用運行時傳遞的變量(good)來檢查字段的長度。
  • 如果該字段是好的,我們繼續循環到下一個字段,並繼續這樣做直到該行的最後一個字段。
  • 如果任何字段的大小大於good,我們會使用NR打印帶有行號的郵件。
  • 如果所有的字段都很好,那麼我們打印消息說明行很好。

如果我誤解了你的問題,請隨時留下評論。

+0

你好,非常感謝你的回答。爲了簡單起見,我說每列只有一個長度,但長度是可變的,我不是所有列的長度。我只是希望那個最長的列應該在我的輸出中顯示,或者最長的一行與罪魁禍首。 – u449355

+0

如果你不知道用什麼長度來比較它,你如何定義最長的列?如果我的可接受長度是10,我將報告11,1000,40000和最長。你可以'awk'{print'Row'NR'是'length($ 0)'characters'}'FS ='\\^_'csv'來打印每行的長度。 –

+1

+1這是一個不太明確的問題的相當好的答案。 – anubhava

2
awk -F'\\^_' -v OFS=':' ' 
{ 
    for (i=1;i<=NF;i++) { 
     if (length($i) > max) { 
      max = length($i) 
      lineNr = NR 
      line = $0 
      fldNr = i 
      fld = $i 
     } 
    } 
} 
END { 
    print lineNr, line 
    print fldNr, fld 
} 
' file 
+1

+1:現在我看到了你的答案,問題變得更加清晰。具有諷刺意味的是,不是嗎? ':P' –

+0

沒有OP發佈他的預期輸出,我們都只是猜測。 –

+0

是的,但我討厭你總是最終猜出最好的事實! ')' –

0

下面是需要使用相同的定界符作爲數據(假設不同的列可以具有不同的可接受的長度),其限定在一行文件中的列長度的答案:

1^_1^_1 

使用該文件(我稱之爲clengths)中並在懶惰方式使用split()獲得索引元素:

awk -F'\\^_' ' 

    NR==FNR {split($0,clen,FS); next} # store the lengths 

    { 
    split($0,a,FS); # put the current line in an array 
    for(i in a) 
    { if(length(a[i]) > clen[i]) print "["FNR","i"] = "a[i] } 
    } 
' clengths data 

此輸出用於陣列樣式索引長期數據[row, col]又名[line #, field #]開始[1,1]

[2,1] = AA 
[2,2] = BB 
[2,3] = CC 

一切都在輸出爲「過大」,並編入索引,使再次找到它更容易。

相關問題