2016-04-02 59 views
-1

如果我有兩個不同行號的文件,我只想輸出相同的行並省略大文件中的多餘行。將命令粘貼到不同的行號文件上

我應該寫什麼粘貼命令?

我想:

paste -d: file1 file2|awk -F ':' '{print $1,$7}' 

但沒有奏效。

+1

編輯您的Q與2個文件的小樣本和您所需的輸出。在突出顯示的文本上使用編輯框左上方的格式工具將其格式化爲代碼/數據/輸出。好運。 – shellter

回答

0

在熱門版本paste中沒有這樣的選項;但在Awk中並不難。

awk 'NR==FNR { a[NR]=$0; next } 
    ! (FNR in a) { exit 0 } 
    { print a[FNR] ":" $0 }' file1 file2 

FNR是當前文件中的行號,和NR是在輸入文件累積的行號。當第一個輸入文件正在處理時,第一個條件將成立;然後,我們會打印對,直到我們用完。

如果你只需要兩個文件,這個簡單的版本就足夠了;推廣到三個或更多將需要相當重要的重構,因爲問題更復雜。

作爲一個快速的解決辦法,如果這是一個一次性的要求,你可以用兩個文件和管道開始與一個多輸入文件,等另一個調用,直到處理完所有的文件。

如果如您的示例所示,只需要提取一些字段,也許可以將$0(整個輸入行)更改爲$1(第一個字段)或任何適合的字段。

只是爲了好玩,這裏是一個Python實現,它不需要將第一個文件的行讀入內存,並且可以處理任意數量的輸入文件(可能受操作系統允許的打開文件數量限制)。選項解析和錯誤檢查留作練習。

from sys import argv 

h = [] 
for filename in argv[1:]: 
    h.append(open(filename, 'Ur')) 
while True: 
    line = [] 
    try: 
     for handle in h: 
      result = handle.readline() 
     if result == '': 
      raise StopIteration 
     line.append(result.rstrip('\n')) 
    print(':'.join(line)) 
    except StopIteration: 
     break 
for handle in h: 
    handle.close() 
0

替代awk的解決方案,特別是如果你不編輯的字段

$ join <(cat -n file1) <(cat -n file2) | cut -d' ' -f2- 

裝飾/去除裝飾圖案。添加行號,將1-1與行號合併,並在最後剝離它們。