Pss... В KDE существует опция, которые делают то же.
Посмотрите, что конфигурация раскладки клавиатуры, на вкладке "Switching Options", там "Переключает политику".
Stealed из этого комментария.
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
У вас должен быть исходный код ядра с включенным взломом ядра. Затем включите 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
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
: печатает только те строки, где подстановка выполнена успешно 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
скроет это значение.
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
, но это будет включать счетчики для завершающих пробелов.
Похоже, вам нужна колонка
:
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
Если вы настаиваете на этом с 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 искусства. :)