2014-12-11 82 views
0

我有代碼象下面的ProcessBuilder java的UNIX命令

ProcessBuilder pb = new ProcessBuilder("bash", "-c", 
     " awk -f awkfile " + " file2 " + file1); 

p = pb.start(); 
p.waitFor(); 
p.destroy(); 

pb = new ProcessBuilder("bash", "-c", 
     " awk -f awkfile " + " file3 " + outFile); 
p = pb.start(); 
p.waitFor(); 
p.destroy(); 

pb = new ProcessBuilder("bash", "-c", 
     " awk -f awkfile " + " file4 " + outFile); 
p = pb.start(); 
p.waitFor(); 

p.destroy(); 

awkfile具有內容

FILENAME==ARGV[1] {vals[$1FS$2FS$3] = ",Y"; next} 
     !($1FS$2FS$3 in vals) {vals[$1FS$2FS$3] = ",N"} 
     {$(NF+1) = vals[$1FS$2FS$3]; print > "outFile"} 

第一運行的ProcessBuilder罰款。不過outFile具有完整輸出(I註釋剩餘代碼和測試)。當我包含第二個ProcessBuilder或第三個ProcessBuilder時,outFile不完整。 這是空間問題還是內存問題。 我不知道如何找到分配給我的主目錄的總空間。 du命令結果如下

du -s /home/xxxxx 
    19172 /home/xxxxx 

df命令結果如下

df -k /home/xxxxx 
    Filesystem    1K-blocks Used Available Use% Mounted on 
    /dev/mapper/rootvg-homelv 2064208 193068 1766296 10% /home 

是可用上述1766296整個/ home目錄或者只是爲了我的家目錄/ home/XXXXX

請你指導我如何解決這個問題。

+0

它是如何awkfile忽略'​​ARGV [0]'?另外,我建議參數化中間輸出文件名(即'ARGV [2]'),而不是在awk文件中對outFile進行硬編碼。 – gknicker 2014-12-11 03:36:06

回答

1

除非啓用配額,否則您可以達到文件系統上可用的最大值。

du -s報告整個目錄的磁盤使用情況。我更喜歡「du-sh/home/xxxx」,它應該以MB,Kbytes等格式報告它,

df -k(我更喜歡df -h)表示整個磁盤有多少可用空間(或卷)上存在文件系統。請注意,這可能包括所有用戶的主目錄。

如果配額已啓用,則可以使用quota -v查看每個文件系統上的配額。

看起來你正在試圖做的是:

  1. 採取3場從第一個文件

  2. 打印出第二個文件的行用「Y」是否結束它(第二個文件中的3個字段)也在第一個文件中找到。

  • 打印出從第二文件具有「 N」結束行,如果它(在第二文件中的3個字段)不存在在第一個文件中。
  • 我不知道你是否使用與你的輸入文件相同的名稱作爲輸出文件。你不會說你的PB中outFile變量的值是多少。如果您正在嘗試從同一個文件讀取和寫入,那麼輸出結果確實是不確定的。

    如果您想從文件文件1,文件2,文件3,文件4所有的共用線,那麼我會使用這樣的:

    ProcessBuilder pb = new ProcessBuilder("bash", "-c", 
        " awk -f awkfile " + " file2 " + file1); 
    
    p = pb.start(); 
    p.waitFor(); 
    p.destroy(); 
    
    // rename the outFile to something different. eg. outfile2. 
    File of= new File("outFile"); 
    File of2= new File("outFile2"); 
    of.renameTo(of2); 
    
    pb = new ProcessBuilder("bash", "-c", 
        " awk -f awkfile " + " file3 " + "outFile2"); 
    p = pb.start(); 
    p.waitFor(); 
    p.destroy(); 
    
    // rename the outFile to something different. eg. outfile2. again. 
    of= new File("outFile"); 
    of2= new File("outFile2"); 
    of.renameTo(of2); 
    
    pb = new ProcessBuilder("bash", "-c", 
        " awk -f awkfile " + " file4 " + "outFile2"); 
    p = pb.start(); 
    p.waitFor(); 
    p.destroy();