Intereting Posts
Новый SSD монтируется только после выпуска команды blkid. mount: не удалось найти свободное устройство Как избавиться от нежелательного входного повторяющегося пояса? Изменение IP-таблиц для разрешения FTP через TLS с использованием пассивных портов Риски, связанные с lazy_itable_init = 1 для ext4 fs на SD-карте Не удается получить доступ к почтовому серверу через SMTP Не удалось запросить секреты VPN №3 Найти крупнейшие файлы определенного владельца Есть ли более простой способ найти свободное место на диске в скрипте, чем «df»? Есть ли в / usr / bin / mail очередь? Автозаполнение флагов после подкоманды Linux Mint / Ubuntu – драйверы гибридных графических карт (AMD® Radeon HD 8570 + Intel HD Graphics 4000) Ищем элегантное решение iproute2 для хоста с 2 интерфейсами на 2 сети и 3 шлюза Виртуальные хосты Nginx для нескольких контейнеров LXC Fedora 26 на USB-накопителе обновил ядро ​​4.11.8 до 4.11.9 больше не загружается

Отрегулируйте зазор между двумя столбцами, чтобы заставить их смотреть прямо

file1.txt :

 hi wonderful amazing sorry superman superhumanwith loss 

file2.txt :

 1 2 3 4 5 6 7 

Когда я пытаюсь объединить с помощью paste -d "" file1.txt file2.txt> actualout.txt

actualout.txt :

 hi 1 wonderful 2 amazing 3 sorry 4 superman 5 superhumanwith 6 loss 7 

Но я хочу, чтобы мой результат выглядел так, как хотелось

OUT.txt :

 hi 1 wonderful 2 amazing 3 sorry 4 superman 5 superhumanwith 6 loss 7 

Какую команду можно использовать для объединения двух файлов в виде желаемого результата? Solaris 5.10 ksh nawk, sed, paste

 awk 'FNR==1{f+=1;w++;} f==1{if(length>w) w=length; next;} f==2{printf("%-"w"s",$0); getline<f2; print;} ' f2=file2 file1 file1 

Примечание: file1 намеренно читается дважды; в первый раз нужно найти максимальную длину линии, а во втором – форматировать каждую строку для окончательной конкатенации с соответствующими строками из файла2. – file2 читается программно; его имя предоставлено функцией awk с переменными атрибутами .

Вывод:

 hi 1 wonderful 2 amazing 3 sorry 4 superman 5 superhumanwith 6 loss 7 

Чтобы обрабатывать любое количество входных файлов, выполните следующие works.but * Примечание: он не справляется с повторением одного и того же имени файла. т.е. каждое имя файла arg относится к другому файлу. Однако он может обрабатывать файлы разной длины – помимо файлов EOF, используются пробелы.

 awk 'BEGIN{ for(i=1; i<ARGC; i++) { while( (getline<ARGV[i])>0) { nl[i]++; if(length>w[i]) w[i]=length; } w[i]++; close(ARGV[i]) if(nl[i]>nr) nr=nl[i]; } for(r=1; r<=nr; r++) { for(f=1; f<ARGC; f++) { if(r<=nl[f]) getline<ARGV[f]; else $0="" printf("%-"w[f]"s",$0); } print "" } } ' file1 file2 file3 file4 

Вот вывод с 4 входными файлами:

 hi 1 cat A wonderful 2 hat B amazing 3 mat C sorry 4 moose D superman 5 E superhumanwith 6 F loss 7 GH 

Кажется, вам нужна column :

 paste file1.txt file2.txt | column -tc2 

который создает этот результат:

 hi 1 wonderful 2 amazing 3 sorry 4 superman 5 superhumanwith 6 loss 7 

Вы можете, конечно, также написать свой собственный скрипт для форматирования. Вот один из способов использования awk :

 awk ' NR==FNR { a[FNR] = $0 ; if (length > max) max = length ; next } { printf "%-*s %s\n", max, a[FNR], $0 } ' file1.txt file2.txt 

pr

Я бы, вероятно, пошел в / п:

 printf %s\\n hi wonderful amazing sorry \ superman superhumanwith loss >/tmp/file #^what is all of that, anyway?^ seq 7 | pr -tm /tmp/file - 

pr может создавать входные файлы (здесь /tmp/file и - stdin) по очереди, например, paste столбцам, но может потребоваться множество других параметров. По умолчанию он также будет печатать верхние и нижние колонтитулы, но -t выдает это.

ВЫВОД:

 hi 1 wonderful 2 amazing 3 sorry 4 superman 5 superhumanwith 6 loss 7 

expand

Если вы заинтересованы в том, чтобы получить больше конкретных по своему усмотрению, другой вариант expand – потому что вы можете передать ему список виртуальных табуляторов, которые будут расширяться до количества пробелов, необходимых для их заполнения.

 seq 7 | paste /tmp/file - | expand -t15 

Здесь нам нужен только первый -t абстоп, конечно …

 hi 1 wonderful 2 amazing 3 sorry 4 superman 5 superhumanwith 6 loss 7 

… но если больше нужно было …

 seq 14 | paste /tmp/file - /tmp/file - | expand -t15,23,38,46 

… мы могли бы записать их в составлении списка, разделенных запятыми …

 hi 1 hi 2 wonderful 3 wonderful 4 amazing 5 amazing 6 sorry 7 sorry 8 superman 9 superman 10 superhumanwith 11 superhumanwith 12 loss 13 loss 14 

grep :

Чтобы найти длину самой длинной строки в файле и не считая каких-либо завершающих пробелов, и как это будет увеличено с помощью стандартных позиций табуляции с 8 символами, это, вероятно, будет работать:

 i=0 while grep -Eq ".{$(((i+=8)-1))}.*[^[:blank:]]" <infile; do :; done 

Этот цикл будет увеличивать $i на 8 для каждого прогона и искать <infile для любой строки, которая содержит как минимум столько же символов, сколько подсчитывается в $i за которым следует любой пустой символ. И поэтому, когда grep не может найти такую ​​строку, он вернет false, и для ваших данных примера он будет присваивать:

 echo "$i" 16 

wc :

Но это все решения POSIX. Самая простая вещь, которую нужно сделать в системе GNU:

 wc -L <infile 

…, чтобы указать длину самой длинной строки в <infile , но это будет включать counts для завершающих пробелов.

Если вы настаиваете на том, чтобы делать это с awk :

 awk -v file=file2.txt '{ cnt++ a[cnt] = $0 getline b[cnt] <file if(length(a[cnt]) > max) max = length(a[cnt]) } END { max++ for(i = 1; i <= cnt; i++) printf "%-" max "s%s\n", a[i], b[i] }' file1.txt 

На стороне примечание: я почти уверен, что это колесо было повторно изобретено уже два миллиона раз, но сейчас я бы предпочел не принуждать мой мозг придумать правильное заклинание, чтобы найти правильные примеры предыдущих SE / SO Изобразительное искусство. 🙂

Ну, я нашел себе то, что хотел. Это работает в Solaris 5.10.

paste file1 file2| pr -t -e$(awk 'n<length {n=length} END {print n+1}' file1)

Я сохраняю длину самой длинной строки в первом файле и использую ее для разграничения табуляции

Сценарий Multi File

Если мы знаем, какой файл будет иметь самое длинное слово, я заменил бы это имя файла при вычислении длины и использовал бы вставку для объединения нескольких файлов. Если file4.txt имеет самую длинную строку. Тогда решение будет

paste file1 file2 file3 file4 | pr -t -e$(awk 'n<length {n=length} END {print n+1}' file4)