
Итак, мне нужно просмотреть журнал, который я получаю по электронной почте (в Windows), найти строку, чтобы определить серийный номер модели. Я решил, что самый простой способ сделать это — написать уродливый пакетный скрипт для преобразования .msg, чтобы я мог прочитать файл. Пример:
cat "*Pre*.msg" | strings2 > agrep.txt
cat agrep.txt | grep "D24" > a21s.txt
cat a21s.txt | cut -d" " -f7 > Air21Serials.txt
это оставляет мне 3 уникальных числа, как мне добавить ALPHA в строку 1, BETA в строку 2 и GAMMA в строку 3 с пробелом или : в качестве разделителя?
Обновлять:файл a21s.txt
похож на
0 1 BXP_0 AIR21B4AB2P KRC118046/1 R3B D240090254 20140416
0 1 BXP_1 AIR21B4AB2P KRC118046/1 R3B D240088108 20140414
0 1 BXP_2 AIR21B4AB2P KRC118046/1 R3B D240090208 20140414
решение1
Есть много способов сделать то, что вы ищете, вот лишь несколько примеров.
awk
и индивидуальное решение
Одно решение, адаптированное под ваш пример, заключается в использовании awk
и передаче ему 3 переменных. Это не является общим, потому что если у вас будет 4 строки, вам придется передать 4 переменные и так далее...
Команда awk
имеет простой способ управления столбцами с помощью их номеров ( $1
, $2
... $NF
последний).
Чтобы было проще читать, я использую ваш старый промежуточный файл.
a21s.txt
awk -v s1="ALPHA" -v s2="BETA" -v s3="GAMMA" ' NR==1 {print s1,$7} ; NR==2 {print s2,$7} ; NR==3 {print s3,$7} ; ' a21s.txt
- В первой строке вы передаете 3 переменные
awk
с опцией-v
. - В следующих строках вы используете эту внутреннюю переменнуюНР, ведет подсчет номера строки. Итак, вы идете печатать переменнуюс1, только когда у вас есть первая строка,с2со вторым... и так далее.
- В последней строке после
'
вы можете указать имя файла, чтобы вам не пришлось вызывать процессcat
и передавать его по конвейеруawk
. - Если переменная (ALPHA,BETA...) генерируется с помощью какого-либо механизма (например, «Serial01, Serial02»), вы можете поместить ее вместо элементов управления номером строки и внешней переменной.
- В первой строке вы передаете 3 переменные
Практическое примечание:под *nix вы можетепоезда командконвейеризация (
|
) одного вывода в следующий без необходимости создания промежуточных файлов.
Так что в вашем примере вы можете использовать напрямую:cat "*Pre*.msg" | strings2 | grep "D24" | cut -d" " -f7 > Air21Serials.txt
Вместо этого
cut
в этом случае можно использоватьawk
командуcat "*Pre*.msg" | strings2 | grep "D24" | awk '...' > final_file.txt
.
Более общее решение: paste
+awk
Допустим, у вас есть ваш a21s.txt
файл и еще один файл ( b.txt
) с таким же количеством строк и внутри строк (по одному слову в каждой), к которым вы хотите добавить префикс (как показано ниже).
ALPHA
BETA
GAMMA
вы можете просто использовать
paste b.txt a21.txt | awk '{print $1,$8}' > Air21Serials.txt
Обратите внимание, что теперь столбец вашего серийного номера стал восьмым, так как вы добавили еще один с помощью вставки.
Примечание
обратитесь к самому Linux за дополнительной информацией man awk
иman paste
:-)
решение2
эхо АЛЬФА>agrep.txt ; кот "Предварительно.msg" | strings2>>agrep.txt
это может быть не точная линия... концепция в том, что выпервыйхочу поместить слово "Alpha" в файл .. использование символа > создает файл, а использование >> добавляет к файлу. Без "новой строки" он должен поместить туда слово ALPHA, а затем добавить первое сообщение.
Возможно, вам придется немного повозиться, чтобы код заработал точно.
EDIT: Поиск найден с помощьюкотиprintfявляются лучшими вариантами, чем echo, поскольку echo может отличаться в зависимости от ОС
например: cat ("АЛЬФА: ") > agrep.txt ; cat "Предварительно.msg" | strings2>>agrep.txt
А для выполнения «однострочной» команды первая вертикальная черта должна быть ; или &&
; между командами всегда выполняется следующая команда && между командами выполняется следующая команда только в том случае, если предыдущая была успешной, а || (двойная вертикальная черта) выполняется следующая команда только в случае, если предыдущая не удалась
решение3
Я не уверен, что strings2
делает или как выглядит ваш ввод, поэтому я не могу быть на 100% уверен, что это будет работать так, как ожидается. Но, возможно, это хотя бы укажет вам правильное направление. cat
может принимать ввод из stdin. Так что вы также можете сделать
echo ALPHA: | cat - "*Pre*.msg" | strings2 > agrep.txt
echo BETA: | cat - agrep.txt | grep "D24" > a21s.txt
echo GAMMA: | cat - a21s.txt | cut -d" " -f7 > Air21Serials.txt