当 "\n" 也在引用的记录中时,在每行前面加上一个数字

preceding each line by a number when "\n" is also inside quoted records

我正在 运行 编写一个 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 的每个 运行 而增加,但是我不知道这是否可能或如何实现。

我认为最简单的解决方案是在每一行前面加上一个特殊的字符序列,然后通过另一个 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 ' == "<LINE_N>" { cnt += 1; printf cnt; =""; } 1;'