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

时间:2014-11-10 11:12:45

标签: unix awk

我使用下面的命令使用前两列连接两个文件。

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

文件2:

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 个答案:

答案 0 :(得分:25)

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

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

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

答案 1 :(得分:4)

您正在使用固定宽度字段,因此您应该使用gnu awk FIELDWIDTHS(或类似)来分隔字段,例如如果第二个字段是此文件中从char 8到char 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>

答案 2 :(得分:1)

如果 field seperator 设置为“”,awk 会自动检测多个空格

因此,这很简单:

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

如果您有一张像上面提到的表格,则获取第二列。