2014-10-20 87 views
9

File1中:擊糊命令輸出格式化

1 
2 

文件2:

1 2 3 
4 5 

文件3:

x x x 
yy yy 
zz 

paste file1 file2 file2給我一個製表符分隔的輸出:

1  1 2 3 x x x 
2  4 5  yy yy 
       zz 

paste -d" " file1 file2 file3給我的輸出:

1 1 2 3 x x x 
2 4 5 yy yy 
    zz 

我希望它象下面這樣:

1 1 2 3 x x x 
2 4 5 yy yy 
     zz 

任何想法,如果這是可能的,或者我應該嘗試其他任何命令?

+0

那麼如果'file2'的第二行是'4 5 6 7 8'?那麼期望的輸出是什麼?這裏的目標是每個輸入文件有一列嗎? – 2014-10-20 14:06:01

+0

目標是使用空格作爲分隔符,並在每個文件中仍保持原始格式。對不起,我沒有得到關於file2的問題。 – Ramesh 2014-10-20 15:26:25

+0

那麼你的問題解決了嗎?你的意見不清楚。 – fedorqui 2014-10-21 09:13:48

回答

5

能使用SED後去除標籤

paste file file2 file3 | sed 's/\t/ /' 

1 1 2 3 x x x 
2 4 5 yy yy 
     zz 

這裏是一個通用的awk腳本,將任意數量的文件與任何格式工作。

awk ' 
    {x=ARGIND;a[x]=a[x]>(b=length($0))?a[x]:b} 
    {F[FNR,x]=$0} 
    END{ 
      for(q=1;q<=FNR;q++) 
      { 
        for(i=1;i<=ARGC;i++) 
        { 
        printf("%-"a[i]"s ",F[q,i]) 
        }print "" 
      } 
    }' file{1,2,3,4) 
+0

如果這些文件在EOL中有標籤,該怎麼辦? – lynxlynxlynx 2014-10-20 13:29:07

+0

不,使用未使用的分隔符會保持盒狀的水平堆疊。 – lynxlynxlynx 2014-10-20 13:47:06

+0

@Jidder,是的,這是我想要的。事實上,我確實嘗試過用sed來替換帶空格的製表符,但最後使用了「g」標誌,這使我的輸出變得糟糕。我現在正在使用您的解決方案。謝謝。 – Ramesh 2014-10-20 15:47:14

2

僅僅從你的例子來看,你似乎可以嘗試先加入文件1和2,然後將它與文件3加入,然後加上一個特殊的分隔符,稍後你會將其更改爲空格。

未經測試的例子:

paste -d" " file1 file2 | paste -d'|' - file3 | sed 's,|, ,g' 

在這裏,我用|,但你應該用你知道的東西肯定不會出現在該數據即一些更模糊的像˘。有點黑客,但應該工作。

對於只有兩個文件:

paste -d'¤' file1 file2 | sed 's,¤, ,g' 
+0

實際上,我正在生成粘貼命令,並將其分配給一個變量pastecmd,並將其作爲$ {pastecmd}執行,所以此方法不適合我。可以有任何數量的文件或至少一個。 – Ramesh 2014-10-20 13:08:10

+1

沒有太多的障礙,只是生成命令採取兩個文件,然後循環所有這些。如果您真的需要它,所有這些代碼和數據都可以包含在同一個變量中。但這已經是一個不同的問題。 – lynxlynxlynx 2014-10-20 13:16:12

+0

我試過了,但我現在有另一個問題。當我使用語法$ {pastecmd}執行生成的命令時,paste命令認爲|是另一個輸入文件。我試圖逃避它,但沒有運氣。我寧願去探索粘貼命令標誌,看看這可能是可以實現的。謝謝你的時間。 – Ramesh 2014-10-20 13:46:03

1

這是你要找的東西嗎?

$ more file{1,2,3,4} | cat 
:::::::::::::: 
file1 
:::::::::::::: 
1 
2 
:::::::::::::: 
file2 
:::::::::::::: 
1 2 3 
4 5 6 7 8 
:::::::::::::: 
file3 
:::::::::::::: 
x x x 
yy yy 
zz 
:::::::::::::: 
file4 
:::::::::::::: 
a a a 
bb bb bb 
c c cc 
d d d 
$ paste file{1,2,3,4} | sed -e 's/\t/ \t/g' | column -t -s$'\t' 
1 1 2 3  x x x a a a 
2 4 5 6 7 8 yy yy bb bb bb 
       zz  c c cc 
         d d d 
+0

不,我需要將每個文件之間的選項卡轉換爲單個空間。我想,通過使用沒有任何標誌的粘貼命令,我可以得到和你一樣的輸出。 – Ramesh 2014-10-20 15:36:17

3

paste兩次讓我:

$ paste <(paste -d" " f1 f2) f3 
1 1 2 3 x x x 
2 4 5 yy yy 
     zz 
+0

這將如何工作更多的文件或不同長度的線? – 2014-10-20 15:53:40

+0

它應該被研究,但它超出了問題的範圍。你很高興在你的回答中介紹了它,但我不認爲有必要概括所有的答案:D – fedorqui 2014-10-20 15:58:43