-1

我有一个小问题。我需要根据文件的某个起始字符串对文件进行排序。例如,根据数字 04、05 或 06 在这种形式中:

04..............
................
................
05..............
................
................
06..............
................
................ etc.. 

这是我的 awk 代码: http: //pastebin.com/dLsWkV3q

或者就在这里:

echo "starting...input file"
read file
echo "reading file..."                                                  

echo "... now sorting..."
cat $file | awk '{
if($1=="04"){
print >> "04_file.txt";
}
if($1=="05"){
print >> "05_file.txt";
 }

if($1=="06"){
print >> "06_file.txt";
 }
}'

echo "finished, bye?"
read wait
echo "bye"

目标是我需要多个仅包含相应块的文件,例如上面的示例:结果我将有 3 个文件。04_file.txt,05_file.txt06_file.txt. AND05_file.txt没有来自 04 块的任何行。最终04_file.txt文件将只有这个:

04..............
................
................

我的问题是它也将其他块保存到 04_file.txt..

我将不胜感激任何帮助。多谢

4

1 回答 1

3

我假设唯一以 04、05 等开头的行是分隔不同块的行:

awk '
    BEGIN { mode="unknown" }
    /^04/ { mode="04" }
    /^05/ { mode="05" }
    /^06/ { mode="06" }
          { if (mode != "unknown") print $0 >> sprintf("%s_file.txt", mode)}' < $file

awk基本上是一个根据模式执行操作的环境。每个模式动作语句都有以下形式

pattern { action }

最简单的模式是匹配当前输入行的正则表达式。BEGIN 是一种特殊情况,它在读取输入之前“匹配”,并且还有一个 END “模式”,它在输入文件被使用后执行。

执行awk时逐行读取输入文件并执行模式与该行匹配的所有操作。在上面的代码中,mode如果输入行以 04、05 等开头 (),则设置变量^。最后一行(没有模式)匹配所有行,并将整行写入相应的文件。

我将尝试用一些伪代码来总结这一点:

mode := "unknown"
for each line of input do
    if line starts with 04 then set mode to 04 endif
    if line starts with 05 then set mode to 05 endif
    if line starts with 06 then set mode to 06 endif

    # mode is now either "unknown" if no 04/05/06 pattern has been read
    # from the file yet or holds the most recently read block start (04/05/06)

    if mode is not "unknown" then
        append whole line to file named 'mode'_file.txt
    endif
endfor

如果您想更进一步,请查看手册页或浏览网页以获取awk介绍。在那里,您还可以了解更多关于模式部分的信息,它可以做的不仅仅是匹配上面示例中的当前输入行。


如果所有块都以两位数字(任何数字)开头,则上面的代码可以缩短为

awk '
    BEGIN { mode="unknown" }
    /^[[:digit:]][[:digit:]]/ { mode=substr($0, 1, 2) }
          { if (mode != "unknown") print $0 >> sprintf("%s_file.txt", mode)}' < $file
于 2012-08-04T07:12:22.193 回答