LINUX.ORG.RU

Сообщения xseed

 

gawk: уменьшить размер таблицы

Форум — General

Добрый день! Просьба помочь разобраться в проблеме. Есть таблица A.txt

A	B	B	C	D	D	D	E
1	2	3	4	5	6	6	7
8	9	10	11	12	13	6	14
15	16	17	18	19	20	6	21
22	23	24	25	26	27	6	28

На выходе необходимо получить таблицу B.txt

A	B;B	C	D;D;D	E
1	2;3	4	5;6;6	7
8	9;10	11	12;13;6	14
15	16;17	18	19;20;6	21
22	23;24	25	26;27;6	28

Объединение полей производится при наличии одинаковых заголовков (предполагается, что поля отсортированы по именам). Не пойму, как это сделать, ведь gawk обрабатывает файл построчно. То есть если сделать {if ($i=$i+1)} он обработает только первую строку.

 

xseed
()

sed: удаление строк одним скриптом несколько раз

Форум — General

Доброй ночи. Использую для удаления строк из нижней части файла рабочий скрипт:

sed -e "1,/=== !delim! ===/!d" A.bak | sed -e "$d" > B.txt

Он оставляет текст с начала файла до строки-разделителя === !delim! === (не включая саму строку).

Подскажите, если я использую перечисление регулярных выражений в скрипте:

sed -e "1,/=== !delim! ===/!d;$d" A.bak > B.txt
то почему отрабатывает только первая часть regexp до ;, а $d не отрабатывает?

PS: Можно как-то упростить этот скрипт?

 ,

xseed
()

Объединить ячейки соседних строк по общему значению первой ячейки

Форум — General

Доброй ночи, уважаемые форумчане! Возможно ли реализовать с помощью gawk преобразование таблицы 1:

a	b	c	d
a	e	f	g
b	h	i	j
a	k	l	m
c	n	o	p
в таблицу 2 вида:
a	b;e	c;f	d;g
b	h	i	j
a	k	l	m
c	n	o	p

Условие: если ячейка A(i)=A(i+1), то:

B(i)=B(i);B(i+1)
C(i)=C(i);C(i+1)
...
NF(i)=NF(i);NF(i+1)

Что-то мысля крутится вокруг да около, а подход никак не могу найти.

 , ,

xseed
()

sed: заменить первые n вхождений в строке

Форум — General

Доброй ночи. Никак не могу реализовать сабж. Вроде пересмотрел все флаги sed, из нужных нашел только Num и g

c:\nncron>echo abracadabraaa | sed -e "s/a/b/5"
abracadabrbaa

c:\nncron>echo abracadabraaa | sed -e "s/a/b/5g"
abracadabrbbb

c:\nncron>echo abracadabraaa | sed -e "s/a/b/g"
bbrbcbdbbrbbb

Странно, что во флагах нельзя использовать отрицание, как перед функцией !s например 5!g, !5, но то есть заменить первые 5 вхождений в строку или все, кроме 5-го.

Может быть через рекурсию или как-то по-другому можно сделать это?

 , ,

xseed
()

sed: вставить символ между соседними TAB

Форум — General

Есть текстовый файл с TAB разделителями полей. Нужно, чтобы в случае, если поле пустое, т.е. идет 2 TAB подряд, между ними вставлялся символ пробела.

sed -e "s/\t\t/\t \t/g"
не подходит, т.к. обрабатывается по 2 TAB в каждом вхождении regexp. В результате в зависимости от номера поля первого вхождения, либо четные, либо нечетные поля остаются пустыми и приходится повторно применять этот regexp. Тогда все вхождения будут заменены:
sed -e "s/\t\t/\t \t/g;s/\t\t/\t \t/g"
Можно ли на sed сделать более короткий regexp? Как он будет выглядеть?

 ,

xseed
()

Объединить 2 таблицы: как сделать FULL OUTER JOIN стандартными средствами

Форум — General

Добрый день! Есть 2 таблицы.

c:\nncron>cat A.txt
Lubos	John	Linda	Rares	Rick
	A	B	C	E
4	1	2	3
c:\nncron>cat B.txt
Anna	Linda	Rares	John	Max
	F	G	E	I
4	2	3	1	
Таблицы не отсортированы. Нужно объединить их так, чтобы получить результирующую таблицу:
c:\nncron>cat C.txt
Lubos	John	Linda	Rares	Rick	Anna	Max
	A	B	C	E		
4	1	2	3			
	E	F	G			I
	1	2	3		4	
Насколько я понимаю, эта операция в терминологии баз данных называется FULL OUTER JOIN (полным объединением). Вот хотелось бы узнать, как его эффективно реализовать в bash стандартными утилитами unixutils - awk sed, sort, grep. Anonymous уже рекомендовал мне утилиту join, но попользовавшись ей, я сделал вывод, что у нее есть 2 существенных недостатка. Во первых, сравниваемые столбцы таблиц должны быть отсортированы по возрастанию плюс выполняется объединение строк, а не полей. То есть, для того, чтобы воспользоваться данной утилитой, эти таблицы нужно транспонировать, добавить недостающие TAB справа и отсортировать по сравниваемому полю, пусть это будет поле 1:
c:\nncron>gawk -F"\t" -v OFS="\t" "NF=5"
c:\nncron>gawk -F\x09 "{OFS = FS}{ for (i=1; i<=NF; i++) print i,NR,$i}" | sort -nk1,1 -k2,2 | gawk -F\x09 " NR>1 && $2==1 { print \"\" }; { printf \"%s\x09\",$3 }; END { print \"\" }" | cut -f 1-3 | sort -k1"
Получим:
c:\nncron>cat A_transp.txt
John	A	1
Linda	B	2
Lubos		4
Rares	C	3
Rick	E	
c:\nncron>cat B_transp.txt
Anna		4
John	E	1
Linda	F	2
Max	I	
Rares	G	3
В винде я столкнулся еще с одной промежуточной проблемой - невозможность использования TAB в качестве выходного разделителя (ключ \t), но это так, мелочи, опустим это.

Вторым существенным недостатком данной утилиты является то, что при использовании ключа -a2 непарные строки таблицы 2 в выводятся без отступов слева, то есть ячейки непарных строк таблицы 2 фактически находятся в полях таблицы 1, что усложняет дальнейшее построение объединенной таблицы. Кроме того, если в исходной таблице идут 2 символа разделителя подряд, например 2 TAB, то в объединенной таблице будет один TAB. Опция -e, замещающая входные пустые ячейки, работает некорректно, заменяются не все пустые ячейки. Поэтому пустые ячейки исходной таблицы приходится заменять с помощью sed. Допустим, я делаю это и использую join:

c:\nncron>sed -i "s/\t\(\t\|$\)/\tNULL0\1/g" A_transp.txt
John	A	1
Linda	B	2
Lubos	NULL0	4
Rares	C	3
Rick	E	NULL0
c:\nncron>sed -i "s/\t\(\t\|$\)/\tNULL0\1/g" B_transp.txt
Anna	NULL0	4
John	E	1
Linda	F	2
Max	I	NULL0
Rares	G	3
Вот такая невыровненная хрень получается:
c:\nncron>join -j 1 -a1 -a2 A_transp.txt B_transp.txt
Anna NULL0 4
John A 1 E 1
Linda B 2 F 2
Lubos NULL0 4
Max I NULL0
Rares C 3 G 3
Rick E NULL0
Или если удалить пустые ячейки и заменить пробелы TAB:
c:\nncron>join -j 1 -a1 -a2 A_transp.txt B_transp.txt | sed -e "s/ /\t/g;s/NULL0//g"
Anna		4
John	A	1	E	1
Linda	B	2	F	2
Lubos		4
Max	I	
Rares	C	3	G	3
Rick	E	
Сравните это с транспонированной матрицей C.txt (как должно быть в идеале):
c:\nncron>cat C.txt | gawk -F\x09 "{OFS = FS}{ for (i=1; i<=NF; i++) print i,NR,$i}" | sort -nk1,1 -k2,2 | gawk -F\x09 " NR>1 && $2==1 { print \"\" }; { printf \"%s\x09\",$3 }; END { print \"\" }" | cut -f 1-5
Lubos		4		
John	A	1	E	1
Linda	B	2	F	2
Rares	C	3	G	3
Rick	E			
Anna				4
Max			I	
Поскольку исходные таблицы были отсортированы, чтобы привести объединенную таблицу в начальный, не сортированный вид, строки транспонированных таблиц нужно было еще и пронумеровать до сортировки, чтобы потом их восстановить...

Вот собственно я хотел бы спросить форумчан, может быть кто из вас сталкивался с такой задачей и каким способом вы ее решали. Может быть, существует более легкий и просто способ. Желательно с помощью утилит unixutils, не прибегая к сторонним ЯП.

 , ,

xseed
()

sed, awk: повторить символ n раз

Форум — General

Добрый вечер! В сети очень много примеров удаления дубликатов символов с помощью sed. А как сделать обратную операцию? То есть заменить символ (допустим пробела) - n такими же. Дело в том, что sed не видит регулярное выражение, если оно находится во второй части substitution, т.е. нельзя написать regexp вида:

sed -e "s/ / \{10\}/g"

Дело в том, мне что нужно менять один пробел n такими же во всем тексте и желательно однострочником на sed или awk или им подобными, так как с bash и циклами я не работаю, а с unixutils.

Да, есть, конечно, простой вариант замены:

sed -e "s/ /          /g"
но он не годится, так как количество пробелов я подставляю в виде числовой переменной %0 esPICK% в кронтабе nncron, поэтому желательно наличие в однострочнике именно числа (цифры) повторов.

 , ,

xseed
()

Сортировка таблицы А по заголовкам таблицы Б

Форум — General

Добрый день! Есть таблица

1	a
2	
3	c
5	d
6	
7	e
и столбец заголовков:
1	
2
3
4
5
6
7
8
9

Как стардартными утилитами unixutils, желательно однострочником sed, grep, diff, sort выполнить сортировку первой таблицы относительно второй, чтобы на выходе получить

1	a
2	
3	c
4
5	d
6	
7	e
8
9
Есть конструкция, сортирующая файл по строкам: Отфильтровать файл 1 по строкам, содержащимся в файле 2: grep -F -f file2.txt file1.txt > include.txt Но она не подходит.

 , ,

xseed
()

sed: удалить последний перенос в файле

Форум — General

Добрый день, уважаемые участники форума! Хотел спросить, как с помощью sed сделать сабж. Мне нужно удалить перенос на последнюю строку, если она пустая, то есть по условию. Или по-другому удалить последний символ в файле, если он является символом переноса (\x0A). Пока не могу разобраться, как это сделать. Есть конструкции, которая делает что-то подобное, например

sed ':a; /$/N; s/\n//; ta'
но она удаляет все переносы, а мне необходимо удаление только последнего.

 ,

xseed
()

Заменить каждое n-ное вхождение в строке

Форум — General

Есть длинная строка с текстом, разделенным символами табуляции. Можно ли с помощью sed сделать замену каждого 10-го tab на символ переноса, чтобы разбить ее на таблицу?

Пробовал так - не получается:

sed -e "s/\t/\x0A/10"
sed -e "s/\t/\x0A/10g"
в первом случае происходит замена только 10-го символа tab, во 2-м 10-го и всех последующих. А как сделать каждый 10-й?

PS: Нашел эту тему, но там говорится о замене первого вхождения в каждой n-ной строке, а не о замене каждого n-ного вхождения в одной строке.

 , ,

xseed
()

Переместить regexp в другое место строки

Форум — Development

Здравствуйте! Помогите, пожалуйста сделать следующее: нужно средствами awk или sed или иных утилит из unixutils (но не bash) написать однострочник, который вырезает во всех строках текст, соответствующий регулярному выражению и вставляет его в этих же строках, но после 17-го Tab'а. sed, по-моему отпадает, т.к. количество разобранных выражений от 0 до 9.

 , ,

xseed
()

sed: замена нескольких слов на соответствующие

Форум — Development

В sed есть конструкция 'y///', выполняющая посимвольную замену. Можно ли сделать подобную замену со словами, т.е. заменить слова в паттерне 1 на соответствующие в паттерне 2, вроде 's/A B C D/E F G H/g' или нет? Из-за отсутствия мозга и невозможности понять все особенности sed приходится использовать значительно более длинное выражение 's/A/E/g;s/B/F/g;s/C/G/g;s/D/H/g'. Как все-таки правильно сделать?

 ,

xseed
()

sed: очистить/удалить предыдущую/следующую строку по условию

Форум — Development

Здравствуйте! Просьба помочь выполнить следующую задачу: Необходимо написать однострочники sed, реализующие следующие функции:

  • Если строка содержит текст, удалить следующую строку;
  • Если строка содержит текст, очистить следующую строку;
  • Если строка содержит текст, удалить предыдущую строку;
  • Если строка содержит текст, очистить предыдущую строку.

Понимаю, что для этой цели нужно использовать конструкцию вида:

sed -e ":a;/IF/N;s/THEN$/\n/g;ta;"
или что-то подобное, но не понимаю, как это сделать, особенно удаление. В случае с удалением, я пытаюсь использовать невидимый символ x0D, который удалиться в следующем пайпе, например:
sed -e ":a;/-$/N;s/\x0A.\+$/\x0D/g;ta;"
данный однострочник удалит следующую строку, если строка заканчивается на "-", но получается как-то коряво.

PS: прошу прощения, сейчас нет linux под рукой, использую unixutils.

 ,

xseed
()

sed: просмотр вперед/назад, отрицание просмотра вперед/назад

Форум — Development

Доброго дня! Пытаюсь удалить пробелы из html-файла, стоящие перед окончанием тега </ :

</div>   </div>
Решил воспользоваться регулярными выражениями:
sed -i 's/\x20+\(?=\x3C\x2F\)//' text.html
sed -i 's/\x20+(\x3C\x2F\)?=//' text.html
но ни одно не работает - пробелы не исчезают

Как в sed организовать остальные операции просмотра, получается эти операции тоже работать не будут?:

/(foo)?#3bar/ - Просмотр назад
/(foo)?~3bar/ - Отрицание просмотра назад
/\w+(\t)?=/ - Просмотр вперед
/foo(bar)?!/ - Отрицание просмотра вперед
GNU sed version 4.0.7

 ,

xseed
()

Посоветуйте продвинутый менеджер буфера обмена

Форум — Desktop

Здравствуйте, форумчане! Давно ищу под linux такую прогу. Главное требование, чтобы могла работать в режиме FIFO (LIFO), т.е. позволяла сначала накопировать данных в одном приложении, а затем навставлять их в другом приложении. Это экономит рабочее время, так как не нужно переключаться несколько раз между окнами при копировании.

Под Windows есть единственная в своем роде бесплатная японская прога charu3 (http://keijiweb.com/software.html, скачать unicode версию), которая умеет это делать. Кроме того, для нее есть плагин repDic (http://keijiweb.com/down/repDic.zip), который позволяет производить поиск и замену в буферном стеке при копировании.

Интересно, умеют ли подобное parcellite или klipper. Кто ставил, поделитесь опытом, можно ли в них замутить FIFO режим и поиск/замену.

PS: В догонку кто-нибудь пытался запускать Charu3 через Wine? У меня не работает никак, - не открывается окно программы при нажатии горячих клавиш, - только иконка в трее светится и все. DLL-ки пробовал подключать, - безрезультатно, да и навряд ли получится использовать такую прогу, если у linux свой api для буфера...

 charu3, ,

xseed
()

Вопрос по grep, cat: Как вывести в одну строку следующее выражение?

Форум — Admin
cat DSLAM_ip.txt FTTB_ip.txt | grep -f mrtg_ip.txt > tmp.txt
grep -v -f tmp.txt mrtg_ip.txt > task_ip.txt

т.е. результат вывода первой строки использовать в качестве аргумента команды grep во второй строке? Желательно без использования tmp.txt...

 ,

xseed
()

Не работает Wi-Fi на ASUS eeePC 1000H

Форум — Linux-hardware

Добрый день форумчане. Вот уже который месяц не могу настроить Wi-Fi. В БИОСе включен, диод горит.

В kern.log такая информация:

Jan 29 12:08:23 debian-eee kernel: [ 7.585611] rt2860sta: module is from the staging directory, the quality is unknown, you have been warned. Jan 29 12:08:23 debian-eee kernel: [ 7.618610] rt2860 0000:01:00.0: PCI INT A -> GSI 19 (level, low) -> IRQ 19 Jan 29 12:08:23 debian-eee kernel: [ 11.900515] pciehp 0000:00:1c.0:pcie04: Bypassing BIOS check for pciehp use on 0000:00:1c.0 Jan 29 12:08:23 debian-eee kernel: [ 11.900746] pciehp 0000:00:1c.0:pcie04: HPC vendor_id 8086 device_id 27d0 ss_vid 0 ss_did 0 Jan 29 12:08:23 debian-eee kernel: [ 11.900955] pciehp 0000:00:1c.1:pcie04: Bypassing BIOS check for pciehp use on 0000:00:1c.1 Jan 29 12:08:23 debian-eee kernel: [ 11.900992] pciehp 0000:00:1c.1:pcie04: HPC vendor_id 8086 device_id 27d2 ss_vid 0 ss_did 0 Jan 29 12:08:23 debian-eee kernel: [ 12.004218] pciehp 0000:00:1c.1:pcie04: Device 0000:03:00.0 already exists at 0000:03:00, cannot hot-add Jan 29 12:08:23 debian-eee kernel: [ 12.004698] pciehp 0000:00:1c.1:pcie04: Cannot add device at 0000:03:00 Jan 29 12:08:23 debian-eee kernel: [ 12.004925] pciehp 0000:00:1c.3:pcie04: Bypassing BIOS check for pciehp use on 0000:00:1c.3 Jan 29 12:08:23 debian-eee kernel: [ 12.004956] pciehp 0000:00:1c.3:pcie04: HPC vendor_id 8086 device_id 27d6 ss_vid 0 ss_did 0 Jan 29 12:08:23 debian-eee kernel: [ 12.004969] pciehp 0000:00:1c.3:pcie04: pci_hp_register failed with error -16 Jan 29 12:08:23 debian-eee kernel: [ 12.005157] pciehp 0000:00:1c.3:pcie04: Slot already registered by another hotplug driver Jan 29 12:08:23 debian-eee kernel: [ 12.005220] pciehp: PCI Express Hot Plug Controller Driver version: 0.4 Jan 29 12:08:23 debian-eee kernel: [ 29.335031] rt2860 0000:01:00.0: firmware: requesting rt2860.bin Jan 29 12:08:23 debian-eee kernel: [ 29.390494] rt2860 0000:01:00.0: firmware file rt2860.bin request failed (-2) Jan 29 12:08:23 debian-eee kernel: [ 29.394806] ERROR! NICLoadFirmware failed, Status[=0x00000001] Jan 29 12:08:23 debian-eee kernel: [ 29.394823] rt28xx Initialized fail! Jan 29 12:08:23 debian-eee kernel: [ 29.400069] rt2860 0000:01:00.0: firmware: requesting rt2860.bin Jan 29 12:08:23 debian-eee kernel: [ 29.405961] rt2860 0000:01:00.0: firmware file rt2860.bin request failed (-2) Jan 29 12:08:23 debian-eee kernel: [ 29.410750] ERROR! NICLoadFirmware failed, Status[=0x00000001] Jan 29 12:08:23 debian-eee kernel: [ 29.410767] rt28xx Initialized fail! Jan 29 12:08:43 debian-eee kernel: [ 53.005717] lp: driver loaded but no devices found

Версия ядра:

root@debian-eee:~# uname -a Linux debian-eee 2.6.32-5-686 #1 SMP Mon Oct 3 04:15:24 UTC 2011 i686 GNU/Linux

Я так не разобрался до конца какой драйвер нужен для версии 2.6.32.

Согласно http://wiki.debian.org/DebianEeePC/HowTo/Wifi — Atheros AR928x b/g/n driver (1000HE, 1002HA, 1005HA, 1001PX, etc.) или Ralink RT2860 (901). Согласно табличке ниже на той странице создал интерфейс wlan0, а он мне нули показывает:

wlan0

Link encap:Ethernet HWaddr 00:00:00:00:00:00 inet addr:192.168.0.2 Bcast:192.168.0.255 Mask:255.255.255.0 BROADCAST MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) Interrupt:19

Что за переменная «pci_hp_register» и почему она failed? Может я в каком конф файле неправильное значение ввел, может она должна называться «pci_ehp_register»?

Есть файлы /etc/modprobe.d/pciehp.conf и /etc/acpi/actions/wireless.sh. Может в них что прописать надо, кроме того, что там уже есть?

Извините, что все так сумбурно изложил, я пока новичек еще не очень разбираюсь в таких вопросах.

xseed
()

RSS подписка на новые темы