Можно использовать stat
управляйте и получите примерно, что Вы хотите:
$ stat -c '%A %a %h %U %G %s %y %n' *
drwxrwxr-x 775 2 saml saml 4096 2013-05-16 22:02:13.230463837 -0400 alsa
drwxrwxr-x 775 31 saml saml 4096 2013-03-26 12:09:20.707827127 -0400 apps
-rw-rw-r-- 664 1 saml saml 43627 2013-05-18 12:28:32.157583577 -0400 autosave.h2song
-rw-rw-r-- 664 1 saml saml 3283 2013-05-18 02:49:41.565154101 -0400 bbbb
drwxrwxr-x 775 4 saml saml 4096 2013-05-03 06:56:50.087842384 -0400 bin
-rw-rw-r-- 664 1 saml saml 4403 2013-05-18 19:20:05.819681196 -0400 blahblah
Вот очищенная версия, если Вы хотите ее:
$ stat -c '%A %a %h %U %G %s %y %n' *| sed 's/\.[[:digit:]]\+[ ]\+-[[:digit:]]\+/ /'
drwxrwxr-x 775 2 saml saml 4096 2013-05-16 22:02:13 alsa
drwxrwxr-x 775 31 saml saml 4096 2013-03-26 12:09:20 apps
-rw-rw-r-- 664 1 saml saml 43627 2013-05-18 12:28:32 autosave.h2song
-rw-rw-r-- 664 1 saml saml 3283 2013-05-18 02:49:41 bbbb
drwxrwxr-x 775 4 saml saml 4096 2013-05-03 06:56:50 bin
-rw-rw-r-- 664 1 saml saml 4403 2013-05-18 19:20:05 blahblah
Смотрите на stat
страница справочника для большего количества операторов формата, которые можно использовать в addtion для тех выше.
Попробуйте это решение с двумя дополнительными временными файлами:
paste tmp1 tmp2 > tmp12
paste tmp4 tmp5 tmp6 > tmp456
paste -d "\n" tmp12 tmp3 tmp456 > tmp7
Это решение было основано на предположении, что опция --d
выбирает разделитель глобально для всех входных файлов, так что это либо будьте пустым или новую строку. Таким образом, это правда с более поздних возникновений -D
, перезаписать предыдущие. Однако, как @DIGITALTRAUUMA указал, что мы можем поставить более одного разделителя, который будет использоваться последовательно. Так что решение @ DigitalTrauma более элегантно, чем мой, так как он полностью избегает дополнительных временных файлов.
Одним из нишевых приложений для моего решения будет иметь место, в котором необходимо использовать один или разделители более одного символа каждый . Это не должно быть возможно только с использованием опции -D
.
Вы можете получить, комбинируя паста
и awk
:
paste -d'|' tmp1 tmp2 tmp3 tmp4 tmp5 tmp6 | awk 'BEGIN { FS = "|" }; {print $1, $2 "\n" $3 "\n" $4, $5, $6}' > tmp7
:
paste -d'|' tmp1 tmp2 tmp3 tmp4 tmp5 tmp6 | awk 'BEGIN { FS = "|" }; {print $1, $2 "\n" $3 "\n" $4, $5, $6}' > tmp7
Пример вывода из некоторых данных, которые я бросил вместе для файлов TMP:
Bill Kerman
123 Main St.
Kerbopalis Kerbskatchewan 12345
Bob Germin
321 Sesame St.
Kerbington Kermont 31416
Я думаю, что эта часть PAPE
MAN PAGE - это то, что Вы хотите:
-D, --delimiters = список Повторно используйте символы из списка вместо вкладок
Итак, этот одноклассник должен работать в вашем случае:
paste -d" \n\n " tmp1 tmp2 tmp3 tmp4 tmp5 tmp6 > tmp7
работает, как ожидалось, с примерами образца @ DOPEGHOTI:
$ grep . tmp*
tmp1:Bill
tmp1:Bob
tmp2:Kerman
tmp2:Germin
tmp3:123 Main St.
tmp3:321 Sesame St.
tmp4:Kerbopalis
tmp4:Kerbington
tmp5:Kerbskatchewan
tmp5:Kermont
tmp6:12345
tmp6:31416
$ paste -d" \n\n " tmp1 tmp2 tmp3 tmp4 tmp5 tmp6
Bill Kerman
123 Main St.
Kerbopalis Kerbskatchewan 12345
Bob Germin
321 Sesame St.
Kerbington Kermont 31416
$
я успешно проверил это с помощью в пасте
из GNU Coreutils 5,97 и 8.21 и BSD (OS X). Не уверен, что другие версии пасты в дикой природе.
Эта команда должна работать.
paste -s tmp1 tmp2 -d '\n' tmp3 -d '\n' tmp4 tmp5 tmp6 > tmp7
sort -dk2,2 phpbook |
sed "s/\t/\n/3;s//\n/2;s// /g"
Насколько я понимаю, у вас есть файл с именем phpbook
, который состоит из строк записей телефонной книги, которые выглядят следующим образом:
{first}\t{last}\t{address}\t{city}\t{state}\t{zip}
Вы хотите отсортировать их на {last}
, добавить новые строки после {last}
и ] {address}
для каждой записи, переведите \ t
abs в
, а затем распечатайте результаты в stdout
. Если это не тогда я не могу понять, что еще могла бы сделать ваша команда - но я могу быть хорошеньким иногда.
Обратите внимание, что sort
по умолчанию ограничивается
символами, поэтому:
sed 's/\t/,/g' | sort ... -t ,
... вероятно, не стоит этого делать.
Обдумывание - это еще кое-что, и я полагаю, что весьма вероятно, что ваши разделители смешаны, и начальный sed
предназначен для их нормализации. В этом есть смысл. Может быть, типа:
1,2\t3\t4,5,6
... или что-то в этом роде. В этом случае необходим первоначальный перевод. Так что, может быть ...
tr , \\t <phbook | sort ... | sed ...
будет немного лучше. Также ...
sort ... -k 2
... может быть проблематичным в крайних случаях, потому что при его использовании вы не сортируете
только второе поле, а скорее от второго поля до конца строки. . Обычно, когда люди делают это, они действительно хотят -k2,2
, который ограничивает данные sort
рассматривает только второе поле.
Также может быть целесообразно добавить вторичный ключ, например:
...sort -dk2,2 -k1,1
... который сортирует
в первую очередь по фамилиям и во вторую очередь по именам. Таким образом, Зед Смит будет каждый раз следовать за Альфой Смитом .
В любом случае, если не ошибаюсь, я прав, сортировка | Конвейер sed
выше должен делать все это. Я предполагаю, что ваш sed
понимает используемые мной сценарии \ e
, но если это не так, вы можете попробовать заменить цитируемый sed
сценарий на:
s/<literal TAB>/\
/3;s//\
/2;s// /g