Я испытываю затруднения управлять большим текстовым файлом,
Мой демонстрационный f1.txt имеет несколько 3000 плюс строки, с ниже формата
Я должен соответствовать строке, и затем соответствовать строкам после той строки с другой строкой (здесь в этом случае "необходимый") и распечатать те согласующие отрезки длинной линии наряду с исходной строкой.
Это должно продолжиться, пока все строки не закончены.
Требование в качестве примера ниже, можно ли помочь?
====== f1.txt ====
String : a
--
==
==
needed line ------------ 100
needed line -------------200
-
String : b
--
==
==
needed line ------------ 500
needed line -------------600
needed line ------------ 700
needed line -------------800
-
String : c
--
==
needed line ------------ 900
===
===
ВЫВОД НЕОБХОДИМ
a needed line ------------ 100
a needed line -------------200
b needed line ------------ 500
b needed line -------------600
b needed line ------------ 700
b needed line -------------800
c needed line -------------900
В awk,
awk -F" : " '/^String/ {string = $2}; /^needed/ {print string, $0}' f1.txt
Можно сделать подобную вещь в sed, хотя это не совсем столь же компактно - в основном это использует пространство хранения sed как эквивалент string
переменная. К сожалению, AFAIK там не является никаким простым способом предварительно ожидать пространство хранения к пространству шаблона в sed, таким образом, мы должны добавить и затем подкачать порядок после:
sed -rn -e '/^String : / {s///;h;}' -e '/^needed/ {G;s/(.*)\n(.*)/\2 \1/;p;}' f1.txt
Примечание: полное решение должно, вероятно, проверить это a String
был найден и присвоен прежде, чем попытаться распечатать его (в случае, если файл содержит needed
строки перед любым String
).
Вот сценарий в качестве примера, который делает это: http://paste.ubuntu.com/8186522/
я сделал несколько предположений:
:
в качестве разделителя. Я использовал в своих интересах это в установке IFS
для read
.