2013-02-24 2 views
1

Я потратил некоторое время на то, как решить эту проблему, но я не уверен, и мое использование unix пока ограничено.Unix - найти шаблоны в файле, скопировать в другой файл

У меня есть текстовый файл, дайте ему название «Text.txt», в котором содержится много информации. Допустим, что он содержит:

SomethingA: aValue 
SomethingB: bValue 
SomethingC: cValue 
SomethingD: dValue 
SomethingD: anotherDValueThisTime 
SomethingA: aValueToIgnore 

Я хочу искать через «text.txt», и найти какую-то ценность, а затем положить значения в новом файле, output.txt.

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

Так выход в «output.txt» должен быть:

aValue 
dValue 
anotherDValue 

Второе значение «SomethingA» хочет быть проигнорированы, поскольку это не первое значение «SomethingA».

Я полагаю, логика быть что-то вроде: Найти SomethingA> output.txt Найти все SomethingD >> output.txt-х

Но я совсем не могу получить его. Любая помощь очень ценится!

+1

Вам все равно, что что-то D перед чем-то А во входном файле? – Stobor

+0

Заказ не является проблемой. Пока все SomethingD вместе, неважно, что что-то происходит в начале или в конце. – ThePerson

+0

В файле * input *? – Stobor

ответ

2

awk идеально

awk '/^SomethingA/ && ! a++ || /^SomethingD/ { print $2 }' FS=: text.txt > output.txt 

Это немного неаккуратно, но вы можете быть более точным с:

awk '$1 == "SomethingA" && ! a++ || $1 == "SomethingD" { print $2 }' FS=: text.txt > output.txt 

К сожалению, это требует фиксированную строку для ключей. Если вы хотите, регулярное выражение, вы можете сделать:

awk 'match($1, "pattern") && ... 
+0

Ты спас меня от головокружения. Спасибо за решение, я потрачу некоторое время на чтение в awk. Это решение действительно работало отлично, в первый раз. Спасибо. Я только что увидел ваш второй ответ/улучшение. Мне нужна только фиксированная строка для ключей, так как все они будут одинаковыми. Еще раз спасибо, я очень ценю это. – ThePerson

+0

Если вы хотите совместить поле с регулярным выражением в awk, вы можете использовать '$ 1 ~/pattern/{stuff}' или '$ 1! ~/Pattern/{stuff}'. – Stobor

+0

@Stobor Спасибо, это определенно более уместно. Я умоляю временную амнезию. –

1
grep -m 1 somethingA inputfile.txt >outputfile.txt 
grep somethingD inputfile.txt >>outputfile.txt 

grep вариант -m устанавливает максимальное количество матчей, которые вы хотите получить.

>> прилагается к файлу, а не переписывается, как >.