2017-03-14 28 views
1

我使用這個awk命令文件和它的作品時,我的文件是11.5 MB,但是當我的文件是12 MB它不工作:AWK segmetation故障(核心傾倒)時,我轉了12 MB

awk -F ";" ' 
{ 
    for (f = 1; f <= NF; f++) 
     a[NR, f] = $f 
} 
NF > nf { 
    nf = NF 
} 
END { 
    for (f = 1; f <= nf; f++) 
     for (r = 1; r <= NR; r++) 
      printf a[r, f] (r==NR ? RS : FS) 
}' file > results 

有沒有什麼辦法可以解決這個問題,還是有更好的解決方案來分割文件?

+0

什麼是您的操作系統?什麼版本的awk? –

+0

出現thi mawk 1.3.3 1996年11月,版權所有(C)邁克爾D.布倫南 – victorhernandezzero

+0

我使用Linux ubuntu – victorhernandezzero

回答

3

你可以每列處理文件一次,每列轉換成一排,當您去:

$ cat tst.awk 
BEGIN { FS=OFS=";" } 
NR==1 { 
    for (i=2;i<=NF;i++) { 
     ARGV[i] = ARGV[1] 
     ARGC++ 
    } 
} 
FNR==1 { if (NR>1) print ""; fileNr++ } 
{ printf "%s%s", (FNR>1 ? OFS : ""), $fileNr } 
END { print "" } 

$ cat file 
a;b;c 
d;e;f 

$ awk -f tst.awk file 
a;d 
b;e 
c;f 

這將需要更長的時間來執行,因爲它讀取輸入文件NF而不是一次,但是它存儲在內存中的所有內容都是文件名NF倍,因此它不會耗盡內存。

+1

這是最好的解決方案,再次喜歡你的天賦'++',簡短而優雅 –

1

如果您有內存限制,您可以將文件拆分爲兩個或多個轉置段並將結果粘貼在一起。

例如,輸入測試文件

1;2;3;4;5 
6;7;8;9;10 
11;12;13;14;15 
16;17;18;19;20 

我們分成兩隊,每兩行的文件file_0和file_1

$ split -l 2 -da 1 file file_ 

運行awk命令的片

$ awk ... file_0 > file_0_tr 
$ awk ... file_1 > file_1_tr 

並用相同的分隔符粘貼結果

$ paste -d';' file_0_tr file_1_tr 

1;6;11;16 
2;7;12;17 
3;8;13;18 
4;9;14;19 
5;10;15;20 
相關問題