AWK如何使用多个空格作为分隔符

24

我正在使用以下命令通过前两列来合并两个文件。

awk 'NR==FNR{a[$1,$2]=substr($0,3);next} ($1,$2) in a{print $0, a[$1,$2] > "br0102_3.txt"}' br01.txt br02.txt
现在,默认情况下,AWk命令使用空格作为分隔符。但是我的文件中可能会包含两个单词之间的单个空格,例如:
文件1:
ABCD               TEXT1 TEXT2                     123123112312312312312312312312312312
BCDEFG             TEXT3TEXT4                      133123123123123123123123123125423423
QWERT              TEXT5TEXT6                      123123123123125456678786789698758567

第二个文件:

ABCD               TEXT1 TEXT2                     12312312312312312312312312312
BCDEFG             TEXT3TEXT4                      31242342342342342342342342343
MNHT               TEXT8 TEXT9                     31242342342342342342342342343

我希望将结果文件设为:

ABCD               TEXT1 TEXT2                     123123112312312312312312312312312312 12312312312312312312312312312
BCDEFG             TEXT3TEXT4                      133123123123123123123123123125423423 31242342342342342342342342343
QWERT              TEXT5TEXT6                      123123123123125456678786789698758567
MNHT               TEXT8 TEXT9                     31242342342342342342342342343

有什么提示吗?

3个回答

49

awk支持将正则表达式作为FS的值,因此您可以指定一个至少匹配两个空格的正则表达式。类似于-F '[[:space:]][[:space:]]+'

$ awk '{print NF}' File2
4
3
4

$ awk -F '[[:space:]][[:space:]]+' '{print NF}' File2
3
3
3

太好了!它正在工作,现在我正在使用命令 awk -F '[[:space:]][[:space:]]+' 'NR==FNR{a[$1,$2]=$3;next} ($1,$2) in a{print $0, a[$1,$2] > "br0102_4.txt"}' br01.txt br02.txt。但是,在连接两个文件的记录之间,对于任何一行,我看到一个换行符LF字符,有没有避免这种情况的提示?因此,连接的行被拆分成两行。 - Apurv
print $0, a[$1,$2] 应该输出第二个文件的行,后跟 OFS(默认为空格),然后是 a[$1,$2] 的值,后跟 ORS(默认为换行符)。你的第一个输入文件可能是 DOS 换行符文件吗? - Etan Reisner
这帮助我解析系统命令的输出,该命令始终使用至少2个空格来划分列,非常感谢! - dragon788

4

您正在使用固定宽度字段,因此应该使用gnu awk FIELDWIDTHS(或类似)来分隔字段。例如,如果第二个字段是此文件中从第8个字符到第23个字符(含)的15个字符:

$ cat file
abc    def ghi        klm
AAAAAAAB C D E F G H IJJJJ
abc       def ghi     klm

$ awk -v FIELDWIDTHS="7 15 4" '{print "<" $2 ">"}' file
<def ghi        >
<B C D E F G H I>
<   def ghi     >

任何依赖于字段间一定数量空格的解决方案,当你的字段之间只有1个或零个空格时会失败。
如果你想从目标字段中删除前导/尾随空格:
$ awk -v FIELDWIDTHS="7 15 4" '{gsub(/^\s+|\s+$/,"",$2); print "<" $2 ">"}' file
<def ghi>
<B C D E F G H I>
<def ghi>

1

如果将字段分隔符设置为" ",awk会自动检测多个空格。

因此,这很简单:

awk -F' ' '{ print $2 }'

如果您有一个类似提到的表格,想获取第二列,请使用以下方法。

1
因此,这只是起作用了:它并没有,对吧?你没有告诉 awk 区分单个和多个空格,即将多个空格作为分隔符,而将单个空格列视为单个列。实质上,您只是在任意数量的空格后打印第二个字符,在您的示例中(因此未返回 TEXT1 TEXT2,如所示)。 - gented

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接