我有这行输出:
M file.txt
进入这个 awk 程序:
awk '{printf("\t%s: %s %s\n", FNR, $1, $2)}'
返回
1: M file.txt
这是可行的并且是通常的情况。但是,如果文件有空格并且输出行如下所示:
M "tmux split-window subcommand.md"
awk 给出了这个:
1: M "tmux
但期望的输出是这样的:
1: M "tmux split-window subcommand.md"
我怎样才能解决这个问题?
答案1
要使用以下命令将行号添加到当前行awk
:
awk '{ printf("%d: %s\n", FNR, $0) }'
第零个字段$0
是完整的行。
答案2
如果您使用分隔符,它不会将引号之间的空格视为单独的单词。
因此,我们可以使用您认为不会出现在输入字符串中的任何分隔符。
echo 'M "tmux split-window subcommand.md"' | awk -F: '{printf("\t%s: %s %s\n", FNR, $1, $2)}' 1: M "tmux split-window subcommand.md"
答案3
尝试这个:
#!/usr/bin/awk -f
BEGIN {
#FPAT = "([^,]+)|(\"[^\"]+\")" # seperator is ,
#FPAT = "([^,]*)|(\"[^\"]*\")" # seperator is , and allow empty field -> notice the "+" changed to "*"
FPAT = "([^ ]+)|(\"[^\"]*\")" # seperator is <space> -> notice the "," changed to " "
}
{
printf("%d: ", FNR);
for (i = 1; i <= NF; i++) {
printf("%s ", $i)
}
printf("\n");
}
我从 GNU awk 的在线手册中得到它。就这个。 https://www.gnu.org/software/gawk/manual/html_node/Splitting-By-Content.html