Отрегулируйте промежуток между двумя колонками, чтобы они выглядели прямыми

Pss... В KDE существует опция, которые делают то же.

Посмотрите, что конфигурация раскладки клавиатуры, на вкладке "Switching Options", там "Переключает политику".

Stealed из этого комментария.

3
13.06.2015, 02:21
5 ответов
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. - файл2 читается программно; его имя обеспечивается функцией awk переменная как аргумент .

Вывод:

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

Для обработки любого количества входных файлов работает следующее. Но * Примечание: он не справляется с повторением одного и того же имени файла. т.е. каждый аргумент файла относится к другому файлу. Однако он может обрабатывать файлы разной длины - помимо файлов 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       G 
                       H 
2
27.01.2020, 21:07

У вас должен быть исходный код ядра с включенным взломом ядра. Затем включите CONFIG_DEBUG_KMEMLEAK и скомпилируйте ядро.

Когда это работает:

echo scan >  /sys/kernel/debug/kmemleak

, чтобы включить, и

cat /sys/kernel/debug/kmemleak

, чтобы сообщить.

Исходное предложение рассмотрено на lwn.net

В дереве исходного кода ядра в разделе Документация

-121 --- 133287 есть kmemleak.txt -

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

вставить файл1 файл2 | pr -t -e $ (awk 'n

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

Сценарий с несколькими файлами

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

вставить файл1 файл2 файл3 файл4 | pr -t -e $ (awk 'n

1
27.01.2020, 21:07
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

Примечание: файл 1 считывается дважды; первый раз - найти максимальную длину строки, а второй раз - отформатировать каждую строку для окончательной конкатенации с соответствующими строками из file2. - файл 2 считывается программным способом; его название обеспечивается функцией variable-as-an-arg .

Вывод:

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       G 
                       H 
-121--93984-

Использование sed :

variable1="$(< inputfile sed -n '3s/ *//p')"
  • variable1 = «$ ([...])» : запускает команду [...] и назначает ее вывод переменной $ variable
  • < inputfile : перенаправляет содержимое inputfile в sed stdin
  • -n : подавляет вывод

sed команды разбивки :

  • 3 : утверждает выполнять следующую команду только на 3-й строке ввода
  • s : утверждает выполнение подстановки
  • /: начинает поиск образца
  • * : соответствует нулю или более символов
  • /: останавливает шаблон поиска/запускает последовательность замены
  • /: останавливает последовательность замены (следовательно, фактически заменяет на ничего )/запускает модификаторы
  • p : печатает только те строки, где подстановка выполнена успешно
-121--151964-

pr

Я, вероятно, пойду с 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 может -m объединять входные файлы (здесь /tmp/file и - stdin) построчно, как вставить по столбцам, но это может занять много других параметров. По умолчанию он также печатает верхние и нижние колонтитулы, но -t скроет это значение.

OUTPUT:

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 не может найти такую строку, она возвращает ложные и, например, данные,он назначит:

echo "$i"
16

wc :

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

wc -L <infile

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

4
27.01.2020, 21:07

Похоже, вам нужна колонка :

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
7
27.01.2020, 21:07

Если вы настаиваете на этом с 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 искусства. :)

3
27.01.2020, 21:07

Теги

Похожие вопросы