当 "\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;'
我正在 运行 编写一个 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;'