LINUX.ORG.RU

Обработка скриптом данных из файла (-ов)

 


0

1

Привет.

1. Стоит небольшая задача. Есть два входных файла формата

file1.txt

где Строка1...СтрокаN это тестовый параметр (нумерации там нет)

Строка1
Строка2
Строка3
Строка4
Строка5
и т.д.
СтрокаN

file2.txt (цирфы только)

22
34
56.1
78.1.1
99
и т.д.
110

необходимо вывести в файл в формат данных (возможно через цикл) или передать DO далее, вида (мне нужно чтобы по DO выполнилось какое условие для первой строки текста (первого файла) со всеми вариантами из второго файла ОТ и ДО, и далее уже вторая строка в таком же формате.Все данные считываются из обоих файлов и передаются на обработку.

Строка1.22
Строка1.34
и т.д.
Строка1.110
Строка2.22
Строка2.34
и т.д.
Строка2.110
и т.д.
СтрокаN.22
и т.д.
СтрокаN.110

Есть соображения как это сделать ?

2. Есть текстовый файл формата

/TEXT1/.../TEXTA.../TEXTB/../101
/TEXT2/.../TEXTJ.../TEXTD/../102.11.1
/TEXT3/.../TEXTK.../TEXTC/../105.2
...............................

необходимо удалить все что до /цифр и сохранить в другой файл результат только из цифирек. Поскольку объем таких огромный (до 100Mb), то хотелось бы видеть как наиболее скорейший вариант обработки.

Спасибо.

Цена вопроса? За наискорейший вариант, конечно, надо будет доплатить по осбому тарифу, но на паре соток думаю сойдемся (средняя ставка на 8 часов работы миддла). Кошелек слать?

anonymous
()

Поскольку объем таких огромный (до 100Mb), то хотелось бы видеть как наиболее скорейший вариант обработки.

Ну раз объём огромный, то думаю тут нужен будет Hadoop

zolden ★★★★★
()
Ответ на: комментарий от zolden

мне хотелось видеть на простом примере для постижения навыков, а не обсуждать сколько и чего. думаю General не для таких делов ...

vladrnd
() автор топика

it's a MAGIC

$ awk '{system("sed \"s/^/"$0"./\" 2.txt")}' 1.txt > 1+2.txt
$ cat 1+2.txt
Строка1.22
Строка1.34
Строка1.56.1
Строка1.78.1.1
Строка1.99
Строка1.и т.д.
Строка1.110
Строка2.22
Строка2.34
Строка2.56.1
Строка2.78.1.1
Строка2.99
Строка2.и т.д.
Строка2.110
Строка3.22
Строка3.34
Строка3.56.1
Строка3.78.1.1
Строка3.99
Строка3.и т.д.
Строка3.110
Строка4.22
Строка4.34
Строка4.56.1
Строка4.78.1.1
Строка4.99
Строка4.и т.д.
Строка4.110
Строка5.22
Строка5.34
Строка5.56.1
Строка5.78.1.1
Строка5.99
Строка5.и т.д.
Строка5.110
и т.д..22
и т.д..34
и т.д..56.1
и т.д..78.1.1
и т.д..99
и т.д..и т.д.
и т.д..110
СтрокаN.22
СтрокаN.34
СтрокаN.56.1
СтрокаN.78.1.1
СтрокаN.99
СтрокаN.и т.д.
СтрокаN.110
justAmoment ★★★★★
()

2. Есть текстовый файл формата

/TEXT1/.../TEXTA.../TEXTB/../101
/TEXT2/.../TEXTJ.../TEXTD/../102.11.1
/TEXT3/.../TEXTK.../TEXTC/../105.2
...............................

необходимо удалить все что до /цифр и сохранить в другой файл результат только из цифирек. Поскольку объем таких огромный (до 100Mb), то хотелось бы видеть как наиболее скорейший вариант обработки.

ШТОА? 100MB — огромный?

Ну, и тут в супержёстком алгоритме без бутылки не разберёшься.

$ sed "s/.*\///" x.txt > y.txt
$ cat y.txt 
101
102.11.1
105.2

justAmoment ★★★★★
()
Ответ на: it's a MAGIC от justAmoment

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

например

find . -iname $file1.$file2

[СтрокаN].[22...110].

Это реально сделать ?

vladrnd
() автор топика
Ответ на: комментарий от vladrnd

В чём смысл разбивания на две переменные? Т.е. общими словами опиши хоть всю задачу: что было вначале и что в должно получиться в конце.

justAmoment ★★★★★
()
Последнее исправление: justAmoment (всего исправлений: 1)
Ответ на: комментарий от justAmoment

это связано с mvn работы плагина. у него есть два параметра на входе вида:

mvn mvnplugin:get -DparentPom=com.group.art:$a:$i ...

где a - название артифакта (текст) i - версия артифакта (цифра)

у каждого названия артифакта (список имен находятся в файле 1.txt) есть диапазон версий ОТ и ДО (файл 2). поэтому для определенного действия требуется весь этот перебор указанный выше { первое имя - диапазон версий, второе имя - диапазон версий и т.д. }. ну как то так.

vladrnd
() автор топика
Ответ на: комментарий от vladrnd

А вам не кажется, что ваши формулировки ужасны? У вас бы было больше помощников, если можно было б чего понять, что вы пишите. Как связано:

find . -iname $file1.$file2

и

[СтрокаN].[22...110]

?

vodz ★★★★★
()
Ответ на: комментарий от vladrnd

Т.е. если в 1.txt — 8 строк, а в 2.txt — 6 строк, тебе просто надо 48 раз вызвать команду mvn?

И для неё при каждом вызове формируется строка запуска из «com.group.art:$a:$i» и на этом всё (и больше эти переменные $a,$i никому не нужны)?

justAmoment ★★★★★
()
Ответ на: комментарий от vodz

скорее я от фонаря по памяти набросал как их можно применить :)

vladrnd
() автор топика
Ответ на: комментарий от vladrnd

Ну, сделай так

$ echo '#!/bin/bash' > mvn.sh; chmod +x mvn.sh; awk '{system("sed \"s/^/mvn mvnplugin:get -DparentPom=com.group.art:"$0":/; s/$/ .../;\" 2.txt")}' 1.txt >> mvn.sh
$ cat mvn.sh 
#!/bin/bash
mvn mvnplugin:get -DparentPom=com.group.art:Строка1:22 ...
mvn mvnplugin:get -DparentPom=com.group.art:Строка1:34 ...
mvn mvnplugin:get -DparentPom=com.group.art:Строка1:56.1 ...
mvn mvnplugin:get -DparentPom=com.group.art:Строка1:78.1.1 ...
mvn mvnplugin:get -DparentPom=com.group.art:Строка1:99 ...
mvn mvnplugin:get -DparentPom=com.group.art:Строка1:и т.д. ...
mvn mvnplugin:get -DparentPom=com.group.art:Строка1:110 ...
mvn mvnplugin:get -DparentPom=com.group.art:Строка2:22 ...
mvn mvnplugin:get -DparentPom=com.group.art:Строка2:34 ...
mvn mvnplugin:get -DparentPom=com.group.art:Строка2:56.1 ...
mvn mvnplugin:get -DparentPom=com.group.art:Строка2:78.1.1 ...
mvn mvnplugin:get -DparentPom=com.group.art:Строка2:99 ...
mvn mvnplugin:get -DparentPom=com.group.art:Строка2:и т.д. ...
mvn mvnplugin:get -DparentPom=com.group.art:Строка2:110 ...
mvn mvnplugin:get -DparentPom=com.group.art:Строка3:22 ...
mvn mvnplugin:get -DparentPom=com.group.art:Строка3:34 ...
mvn mvnplugin:get -DparentPom=com.group.art:Строка3:56.1 ...
mvn mvnplugin:get -DparentPom=com.group.art:Строка3:78.1.1 ...
mvn mvnplugin:get -DparentPom=com.group.art:Строка3:99 ...
mvn mvnplugin:get -DparentPom=com.group.art:Строка3:и т.д. ...
mvn mvnplugin:get -DparentPom=com.group.art:Строка3:110 ...
mvn mvnplugin:get -DparentPom=com.group.art:Строка4:22 ...
mvn mvnplugin:get -DparentPom=com.group.art:Строка4:34 ...
mvn mvnplugin:get -DparentPom=com.group.art:Строка4:56.1 ...
mvn mvnplugin:get -DparentPom=com.group.art:Строка4:78.1.1 ...
mvn mvnplugin:get -DparentPom=com.group.art:Строка4:99 ...
mvn mvnplugin:get -DparentPom=com.group.art:Строка4:и т.д. ...
mvn mvnplugin:get -DparentPom=com.group.art:Строка4:110 ...
mvn mvnplugin:get -DparentPom=com.group.art:Строка5:22 ...
mvn mvnplugin:get -DparentPom=com.group.art:Строка5:34 ...
mvn mvnplugin:get -DparentPom=com.group.art:Строка5:56.1 ...
mvn mvnplugin:get -DparentPom=com.group.art:Строка5:78.1.1 ...
mvn mvnplugin:get -DparentPom=com.group.art:Строка5:99 ...
mvn mvnplugin:get -DparentPom=com.group.art:Строка5:и т.д. ...
mvn mvnplugin:get -DparentPom=com.group.art:Строка5:110 ...
mvn mvnplugin:get -DparentPom=com.group.art:и т.д.:22 ...
mvn mvnplugin:get -DparentPom=com.group.art:и т.д.:34 ...
mvn mvnplugin:get -DparentPom=com.group.art:и т.д.:56.1 ...
mvn mvnplugin:get -DparentPom=com.group.art:и т.д.:78.1.1 ...
mvn mvnplugin:get -DparentPom=com.group.art:и т.д.:99 ...
mvn mvnplugin:get -DparentPom=com.group.art:и т.д.:и т.д. ...
mvn mvnplugin:get -DparentPom=com.group.art:и т.д.:110 ...
mvn mvnplugin:get -DparentPom=com.group.art:СтрокаN:22 ...
mvn mvnplugin:get -DparentPom=com.group.art:СтрокаN:34 ...
mvn mvnplugin:get -DparentPom=com.group.art:СтрокаN:56.1 ...
mvn mvnplugin:get -DparentPom=com.group.art:СтрокаN:78.1.1 ...
mvn mvnplugin:get -DparentPom=com.group.art:СтрокаN:99 ...
mvn mvnplugin:get -DparentPom=com.group.art:СтрокаN:и т.д. ...
mvn mvnplugin:get -DparentPom=com.group.art:СтрокаN:110 ...
justAmoment ★★★★★
()

со всеми вариантами из второго файла ОТ и ДО, и далее уже вторая строка в таком же формате

Это называется «декартово произведение», «Cartesian Product», «CROSS JOIN».

Существует команда join, которая объединяет два списка по общему полю. Eсли это поле одинаковое у всех элементов обоих списков, то получается декартово произведение. Теперь трюк: пустое поле всегда одинаково:

$ join -j 999999 -o 1.1,2.1 file1.txt file2.txt
Строка1 22
Строка1 34
Строка1 56.1
Строка1 78.1.1
Строка1 99
Строка1 110
Строка2 22
Строка2 34
Строка2 56.1
Строка2 78.1.1
Строка2 99
Строка2 110
Строка3 22
....

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

legolegs ★★★★★
()
Ответ на: Ну, сделай так от justAmoment

awk '{system(«sed

Когда вы это написали в первый раз оно бы сошло на прикольный намёк ТСу делать самому, но когда это повторили в расширенном скрипте...

Кто ж вас так учил?!

vodz ★★★★★
()
Ответ на: Ну, сделай так от justAmoment

вродеб как вариант выглядит рабочий. а дайте расшифроку плз всему этому «$0»:/; s/$/ .../;\" 2.txt")}' 1.txt .... чо т я завис тут :)

vladrnd
() автор топика
Ответ на: комментарий от justAmoment

1) если file2 достаточно большой:

xargs -E " -L1 -I{} awk -v pre={} '...' <file1 file2

2) GNU-grep -o ; awk -F/ '..NF..'

anonymous
()
Ответ на: Ну, сделай так от justAmoment

также пытаешься добавить локальный ключ к mvn во всю эту связку начинает ругаться, хотя -DrepoId=ar схамала

awk '{system(«sed \„s/^/mvn mvnplugin:get:get -DrepoId=ar -DLinksPrefix=/home/storage/ -DparentPom=com.group.art:“$0»:/; s/$/ /;\" 2.txt" )}' 2.txt >> mvn.sh

sed: -e expression #1, char 57: unknown option to `s'

vladrnd
() автор топика
Ответ на: комментарий от vladrnd

также пытаешься добавить локальный ключ к mvn во всю эту связку начинает ругаться, хотя -DrepoId=ar схамала

Потому что это магия и, если ты не следуешь определённым ритуалам, то всё закономерно перестаёт работать. Лично ты, видимо, прогулял уроки, на которых рассказывали про экранирование слэшей.

2.txt" )}' 2.txt

ну и делать итерации по содержимому 2.txt, для того, чтобы потом ещё раз делать итерации по содержимому 2.txt — так себе идея.

justAmoment ★★★★★
()
Последнее исправление: justAmoment (всего исправлений: 1)
Ответ на: комментарий от vladrnd

а дайте расшифроку плз всему этому «$0»:/; s/$/ .../;\" 2.txt")}' 1.txt

Вторая команда sed для добавления в конце строки «пробела и трёх точек», ты же сам в примере указал, что, именно, так тебе и надо.

justAmoment ★★★★★
()
Ответ на: комментарий от vodz

Когда вы это написали в первый раз оно бы сошло на прикольный намёк ТСу делать самому, но когда это повторили в расширенном скрипте...

Эта магическая конструкция выполняет ровно то, что захотел ТС, не больше и не меньше. Но... Есть одно большое «но». Как только появляются дополнительные хотелки в виде: «а здесь мы подкрутим», «а здесь мы добавим», «а ещё мы забыли про ...», «ну, и фазу луны надо, конечно же, учесть»; то вся эта невообразимая конструкция пропитывается духом настоящей магии, растёт, ширится, начинает жить своей жизнью. И только колдун не*бической силы и упорства может ей управлять.

Данная задача с конкатенацией содержимого двух файлов и запуском одной и той же внешней программы настолько проста, что может быть выполнена в 3 часа ночи на любом языке программирования левой пяткой за 15 минут с перекурами.

Это я к тому, что пока падаван не ступит на путь использования какого либо языка на практике и не упрётся в стенку сложности применяемых им методов при решении его задач, до тех пор объяснять, что его в будущем ждут какие-то гипотетические сложности при использовании этого языка, вообще не имеет смысла. Вот когда он сам пройдет этим путём, тогда и выберет другой язык, который в данный момент будет лучше ему подходить.

Кто ж вас так учил?!

Боженька, лично.

justAmoment ★★★★★
()
Ответ на: комментарий от justAmoment

у меня вообще не было таких уроков :) вопрос актуален.

vladrnd
() автор топика
$ q 'select t1.c1, t2.c1 from file1.txt t1 join file2.txt t2'
Строка1 22
Строка1 34
Строка1 56.1
Строка1 78.1.1
Строка1 99
Строка1 110
Строка2 22
Строка2 34
Строка2 56.1
Строка2 78.1.1
Строка2 99
Строка2 110
...
$ sed 's|.*/\([^/]*\)|\1|' < file3 
101
102.11.1
105.2
anonymous
()
Ответ на: комментарий от anonymous

Если глубина вложенности / одинакова, то тоже q:

q -d/ 'select c7 from file3'
101
102.11.1
105.2

anonymous
()
Ответ на: комментарий от justAmoment

Эта магическая конструкция

В конструкции

awk '{system(«sed...
нет ничего магического, это просто обычная глупость начинающего. system предназначена для вызова из скрипта внешней программы для выполнения действий, которые в текущем языке исполняются трудно/долго и т д. Отсюда следствие: единственная строчка system в скрипте только из этой строчки — полный идиотизм. Во-вторых, накой вызывать вообще sed из awk? awk умеет всё что умеет делать sed, скорее всего медленнее, но зато удобнее, так как имеет более человеческий синтаксис. Смысл то? Либо-либо получается. Короче:
#!/bin/awk -f

BEGIN { s0="mvn mvnplugin:get -DparentPom=com.group.art:" }
{ l=$0
  while((getline < "2.txt") > 0) 
        print  s0 l "." $0 
  close("2.txt")
}

vodz ★★★★★
()
Последнее исправление: vodz (всего исправлений: 2)
Ответ на: комментарий от vodz

мне кажется здесь что то забыло. не хватает данных из 1.txt


#!/bin/awk -f

BEGIN { s0="mvn mvnplugin:get -DparentPom=com.group.art:" }
{ l=$0
  while((getline < "2.txt") > 0) 
        print  s0 l "." $0 
  close("2.txt")
}

vladrnd
() автор топика

Скажите, тут конкурс на самый прикольный вариант?

#!/bin/bash

for value1 in $(cat file1.txt); do
  for value2 in $(cat file2.txt); do
    echo mvn mvnplugin:get -DparentPom=com.group.art:$value1:$value2
  done
done
keir ★★
()
Ответ на: комментарий от vladrnd

Коллеги, а без awk и вызова через system, sed преобразить в рабочему виду получится ?

Ну так у justAmoment была запускалка sed-а на каждую строку. sed в первой вашей задаче вообще не нужен, вы ничего с текстом не делаете, а только склеиваете строки. Потому самый простой вариант на том теге, в котором вы этот топик создали. Правда keir дал не очень качественный скрипт, так делать не очень правильно. Вот так получше будет:

#!/bin/bash

while read -r value1 ; do
  while read -r value2 ; do
    echo mvn mvnplugin:get -DparentPom=com.group.art:"$value1:$value2"
  done < 1.txt
done < 2.txt

vodz ★★★★★
()
Последнее исправление: vodz (всего исправлений: 1)
Ответ на: комментарий от vladrnd

результат то одинаков.

Это пока у вас строки без пробелов и звездочек. Не надо привыкать к неправильному.

vodz ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.