" \ n"在每一行前面加一个数字也在引用记录内

时间:2018-03-08 23:52:01

标签: awk gawk

我正在运行awk脚本:

find ~/dir/ -regextype sed -regex '.*\.[0-9]\{3\}\.txt' -exec ~/script.awk {} \;

它通过从find找到的文件中提取数据来生成行。我希望每行前面都有一个整数来表示序列,即。第一行为1,第二行为2等。问题是awk生成的一列中包含新的行符号\n,即。来自awk的一行可以看起来像:

"col1" col2 "col3_\n_col3_continued_\n_more_col3" "col4"

这些行是在脚本的END部分构建的:

END {
    method=""
    i=1
    for (i=1;i<nm;i++) {
        if (i==1) {
            method=methodarr[i]
        }
        else {
            method=method"\n"methodarr[i]
        }
    }
    method="\""method"\""
    printf "%s %s %s %s\n",date,time,method,"\""FILENAME"\""
}

这会导致显示有更多行存在文件但记录被正确分隔,因为新行符号用引号括起来。然后,生成的文本文件将作为数据导入到某些电子表格软件中,并且由撇号括起的新行分隔部分将正确放入单个单元格中。但这可以防止在每行之前添加一个简单的数字。

一个简单的解决方案是假设第一列的格式,再次将结果传递给awk,匹配第一列格式并在行号之前。我不喜欢这种方法。是否有更简单的方法,理想情况下无需假设第一列?我猜想全局系统变量i的某种方式会因awk的每次运行而增加,但我不知道它是否可能或如何实现。

1 个答案:

答案 0 :(得分:1)

我认为最简单的解决方案是在每行之前加上一个特殊的字符序列,然后用另一个AWK脚本替换它。

例如,替换您的代码:

printf "%s %s %s %s\n",date,time,method,"\""FILENAME"\""

使用:

printf "<LINE_N> %s %s %s %s\n",date,time,method,"\""FILENAME"\""

然后通过此脚本运行输出,将<LINE_N>替换为数字:

awk '$1 == "<LINE_N>" { cnt += 1; printf cnt; $1=""; } 1;'