Как использовать некоторую обработку текста (awk и т. Д.), Чтобы поместить некоторый символ в текстовый файл в определенных строках - PullRequest
0 голосов
/ 30 июня 2009

У меня есть текстовый файл с шестнадцатеричными значениями, одно значение в отдельной строке. Файл имеет много таких значений один под другим. Мне нужно сделать некоторый анализ значений, для которых мне нужно, но какой-то разделитель / маркер говорят «#» в этом файле перед номерами строк 32,47,62,77 ... разница между двумя номерами строк в этом шаблоне 15 всегда.

Я пытаюсь сделать это с помощью awk. Я попробовал несколько вещей, но не сработало.

Какая команда в awk, чтобы сделать это?

Любое другое решение с использованием другого языка / скрипта / инструмента также приветствуется.

Спасибо.

-AD

Ответы [ 3 ]

2 голосов
/ 30 июня 2009

Вот как вы можете использовать AWK для него,

awk 'BEGIN{ i=0; } \
    {if (FNR<31) {print $0} \
     else {i++; if (i%15) {print $0} else {printf "#%s\n",$0}}\
    }' inputfile.txt > outputfile.txt

Как это работает,

  • BEGIN устанавливает итератор для подсчета с вашей стартовой строки 32
  • FNR <31 начинает отсчет с 31-й записи (следующая запись требует <code>#)
    • строки ввода называются записями, а FNR - это переменная AWK, которая считает их
  • Как только мы начинаем считать, i%15 ставит префикс # в каждой 15-й строке
  • $0 печатает запись (строку) как

Вы можете ввести весь текст с пробелами, пропуская завершающий символ '\' в одной командной строке.
Или вы можете использовать его как файл AWK,

# File: comment.awk
BEGIN{ i=0; }
$0 ~ {\
    if (FNR<31) {print $0} \
    else {\
        i++; \
        if (i%15) {\
            print $0
        }\
        else {\
            printf "#%s\n",$0
        }\
    }\
 }

И запустить его как,

awk -f comment.awk inputfile.txt > outputfile.txt

Надеюсь, это поможет вам использовать больше AWK.

0 голосов
/ 30 июня 2009

Haskell:

offset = 31;
chunk_size = 15;

main = do
{
  (h, t) <- fmap (splitAt offset . lines) getContents;
  mapM_ putStrLn h;
  mapM_ ((putStrLn "#" >>) . mapM_ putStrLn) $
  map (take chunk_size) $
  takeWhile (not . null) $
  iterate (drop chunk_size) t;
}
0 голосов
/ 30 июня 2009

Python:

f_in = open("file.txt")
f_out = open("file_out.txt","w")
offset = 4 # 0 <= offset < 15 ; first marker after fourth line in this example

for num,line in enumerate(f_in):
   if not (num-offset) % 15:
       f_out.write("#\n")
   f_out.write(line)
...