Как добавить к первым 3 строкам файла префиксы с разными переменными?

Как добавить к первым 3 строкам файла префиксы с разными переменными?

Итак, мне нужно просмотреть журнал, который я получаю по электронной почте (в 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»), вы можете поместить ее вместо элементов управления номером строки и внешней переменной.
  • Практическое примечание:под *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

Связанный контент