1

Поэтому мне нужно просмотреть журнал, который я получил по электронной почте (в 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 

3 ответа3

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 .
    • В следующих строках вы используете, что внутренняя переменная NR, ведет подсчет номера строки. Итак, вы идете печатать переменную s1, только когда у вас есть первая строка, s2 со второй ... и так далее.
    • В последней строке после ' вы можете указать имя файла, чтобы вам не нужно было вызывать процесс 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

Обратите внимание, что теперь столбец вашего сериала является восьмым, потому что вы добавили еще один с помощью команды paste.


Заметка

обратитесь к самому Linux за дополнительной информацией с man awk и man paste :-)

0

echo ALPHA > agrep.txt; кот " Pre.msg" | strings2 >> agrep.txt

это может быть не точная строка ... концепция заключается в том, что вы сначала хотите поместить слово "альфа" в файл ... с помощью символа> создайте файл, а с помощью символа >> добавьте файл. Без "новой строки" следует добавить слово "АЛЬФА", а затем добавить первое сообщение.

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

РЕДАКТИРОВАТЬ: поиск, найденный с использованием cat и printf, является лучшим вариантом, а не эхо, так как эхо может отличаться в зависимости от ОС

например: cat ("ALPHA:")> agrep.txt; кот " Pre.msg" | strings2 >> agrep.txt

И для выполнения команды "один лайнер" первый канал должен был быть; или же &&

; промежуточные команды всегда выполняют следующую команду &&, между командами выполняет следующую команду, только если предыдущая преуспела и || (двойной канал) выполняет следующую команду, только если предыдущий не удался

0

Я не уверен, что делает strings2 или как выглядит ваш вклад, поэтому я не могу быть на 100% уверен, что это будет работать так, как ожидалось. Но, возможно, это, по крайней мере, укажет вам правильное направление. cat может принять ввод от стандартного ввода. Итак, вы могли бы также сделать

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .