如何使用一些文本处理(awk等..)将某些字符放在某些行的文本文件中

时间:2009-06-30 08:16:26

标签: parsing text

我有一个文本文件,其中包含十六进制值,在一行中有一个值。文件具有许多这样的值,一个在另一个之下。我需要对我需要的值进行一些分析,但某些分隔符/标记在行号32,47,62,77之前在此文件中表示'#'...此图形中两个行号之间的差异总是15岁。

我正在尝试使用awk。我尝试了一些东西,但没有工作。

awk中的命令是什么?

也欢迎涉及其他语言/脚本/工具的任何其他解决方案。

谢谢。

-AD

3 个答案:

答案 0 :(得分:2)

这就是你可以使用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&lt; 31从第31条记录开始计算(下一条记录需要#
    • 输入行称为记录,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。

答案 1 :(得分:0)

的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)

答案 2 :(得分:0)

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;
}