Форматирование вывода команды bash paste

File1:

1
2

File2:

1 2 3
4 5

файл file3:

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

любая идея, если это возможно, или я должен попробовать любой другой команды?

4 ответов


можно использовать 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())?a[x]:b}
    {F[FNR,x]=}
    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)

paste дважды делает это для меня:

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

только из ваших примеров, кажется, вы можете попробовать сначала присоединиться к файлам 1 и 2, а затем присоединиться к файлу 3, но со специальным разделителем, который вы позже измените на пробел.

непроверенные пример:

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

здесь я использовал |, но вы должны использовать то, что вы точно знаете, не появится в данных, т. е. что-то еще более неясное, как ˘. Немного взлом, но должно сработать.

всего два файла:

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

это то, что вы ищете?

$ 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