AWK参数处理问题:如何打印$1、$2及剩余所有参数
我来帮你解决这两个AWK相关的问题:
问题一:在AWK中打印$1、$2后输出剩余所有参数
要实现这个需求,有两种实用的方式:
方式一:循环遍历剩余字段
逻辑直观,哪怕字段数不足3个也能正常工作:
awk '{ # 先打印前两个字段 print $1, $2; # 从第3个字段开始逐个输出 for(i=3; i<=NF; i++) { printf "%s ", $i; } # 补换行符,保证格式统一 print "" }'
方式二:截取整行剩余内容
写法更简洁,通过截取$0(整行)中从第3个字段开始的部分:
awk '{ if (NF >= 3) { # 获取第3个字段的起始位置,截取后续内容 rest = substr($0, index($0, $3)); print $1, $2, rest; } else { # 字段不足3个时直接输出整行 print $0; } }'
问题二:处理多字段行,生成正确的别名格式
你的核心需求是把每行第一个字段作为缩写,将第2个到最后所有字段的内容打包到引号中。原来的代码只固定取了$2和$3,自然无法处理多字段的情况,这里提供两种修改方案:
方式一:循环拼接命令内容
通过循环遍历从第2个字段开始的所有内容,拼接成完整的命令字符串:
sed "s/\s*#.*$//;/^\s*$/d" $command_file | awk -v c="$cmd" -v o="$comp" '{ cmd_content = "" # 从第2个字段开始遍历拼接 for(i=2; i<=NF; i++) { cmd_content = cmd_content $i " " } # 去掉末尾多余的空格 sub(/ $/, "", cmd_content) # 输出最终格式 print c " " $1 o "\"" cmd_content "\"" }' >> $file
方式二:截取第一个字段后的整行内容
直接从整行中去掉第一个字段,剩余部分就是需要的命令内容,写法更精简:
sed "s/\s*#.*$//;/^\s*$/d" $command_file | awk -v c="$cmd" -v o="$comp" '{ # 定位第2个字段的起始位置,截取后续所有内容 rest = substr($0, index($0, $2)) print c " " $1 o "\"" rest "\"" }' >> $file
比如输入行svu playerctl -p spotify volume +0.05,用上面的代码会生成:
abbr svu "playerctl -p spotify volume +0.05"
完全符合你的预期。
内容的提问来源于stack exchange,提问作者Onizudo
相关产品推荐
相关产品推荐

