2017-09-01 46 views
-1

我希望有人能幫助我。 希望我能用一些選項(或其他簡單的命令)通過「粘貼」或「awk」命令來完成這項任務。結合文本文件列明智與不同數量的行

我有很多不同數量的文件。 我想列這些文件明智的,但沒有成功,因爲我喜歡。問題在下面。

F1.txt 

1 549 15981 
2 835 19591 
3 322 3896 
4 298 3778 

F2.txt 

1 549 15981 
2 835 19591 
3 322 3896 
4 298 3778 
5 16 202 

我想要的不過outFile是

1 549 15981 1 549 15981 
2 835 19591 2 835 19591 
3 322 3896 3 322 3896 
4 298 3778 4 298 3778 
       5 16 202 

但我和我的命令得到 「粘貼F1.txt F2.txt |列-s $ '\ T' -tn」 是

1 549 15981 1 549 15981 
2 835 19591 2 835 19591 
3 322 3896 3 322 3896 
4 298 3778 4 298 3778 
    5 16  202 

如您所見,由於F1沒有第五行,所以F2的第五行向右移動。這不是我想要的。希望有人可以幫助解決這個問題。

+1

無法重現,工作正常(需要對齊) – RomanPerekhrest

+1

您的輸入文件需要製表符分隔,不以空白分隔。 –

+0

埃德,非常感謝。你解決了我的問題。 – user2182606

回答

0

輸入

$ cat f1 
1 549 15981 
2 835 19591 
3 322 3896 
4 298 3778 

$ cat f2 
1 549 15981 
2 835 19591 
3 322 3896 
4 298 3778 
5 16 202 

輸出

使用awk,但它會使用array因此可遇到內存問題,如果您的文件過大

$ awk -v OFS="\t" 'FNR==NR{a[FNR]=$0;m=m>length?m:length;next}{print (FNR in a)?a[FNR]:sprintf("%*s",length,""),$0}' f1 f2 
1 549 15981 1 549 15981 
2 835 19591 2 835 19591 
3 322 3896 3 322 3896 
4 298 3778 4 298 3778 
       5 16 202 

說明

awk -v OFS="\t" ' 
       FNR==NR{ 
          a[FNR]=$0;     # save each record of file f1 in array a 
          m=m>length?m:length;  # find max length of line/row from file f1 
          next      # go to next line 
       } 
                 # read file f2 
       { 
        # if value exists in array a for row index then 
        # print array element, else sprintf with the length of max length line 
        # and current line/row/record of file f2 

        print (FNR in a)?a[FNR]:sprintf("%*s",length,""),$0 

       }' f1 f2 

這裏使用pr

$ pr -mt f1 f2 
1 549 15981    1 549 15981 
2 835 19591    2 835 19591 
3 322 3896    3 322 3896 
4 298 3778    4 298 3778 
          5 16 202 

嘗試SED或其他一些工具來抑制過剩的標籤,類似下面

的一種方式3210
0

paste F * | awk'($ 0〜/^\ t /){$ 0 =「\ t」$ 0} {print}'

+0

你可以簡化'paste f1 f2 | awk'/^\ t/{$ 0 =「\ t」$ 0} 1'' –