Windows环境下Awk列处理的异常行为咨询
AWK修改字段后$0合并空格是正常行为
这是AWK的正常行为,核心原因在于AWK的工作机制:
- 当AWK读取一行输入时,会把原始文本完整保存在
$0中,同时按照**字段分隔符(FS,默认是任意空白字符)**拆分出$1、$2等字段。 - 若不修改任何字段,直接打印
$0,输出的是原始输入的完整文本,自然保留所有原始空格。 - 但只要修改了任意一个字段(比如你这里将
$1=$2=$3=$4=NULL),AWK会自动用当前FS重新拼接所有字段生成新的$0。由于默认FS会把多个空白字符视为单个分隔符,重新拼接后的$0里,字段之间只会保留单个空格,原始多空格因此被合并。
如果需要保留原始空格格式,不要通过修改字段的方式处理,直接对原始$0做字符串截取即可,比如以下两种方案:
方案1:通过第5个字段的位置截取
dir "//<server name/dir>" | awk '/DIR/ && $6 > 1 {print substr($0, index($0, $5))}' > .\jobList.txt
原理是定位第5个字段在原始$0中的起始位置,从该位置截取剩余内容,完全保留原始空格格式。
方案2:用正则替换前4个字段
dir "//<server name/dir>" | awk '/DIR/ && $6 > 1 {print gensub(/^([^ ]+ +){4}/, "", 1)}' > .\jobList.txt
用正则匹配开头的4组“字段+空格”并替换为空,剩余部分就是原始格式的文件名内容。
内容的提问来源于stack exchange,提问作者dana
相关产品推荐
相关产品推荐

