【发布时间】:2012-04-16 16:25:59
【问题描述】:
我是 shell 脚本的新手,我正在尝试从以下格式的 txt 文件中读取数据。
A: 1, 2, 3, 4
B: 1,2; 3, 4
这是我的代码:
awk -F':/,/;/ ' '{ echo $2 $3 $4 $5 $5 }' -f 'testread.txt'
我只需要文本文件中的数字。 谢谢。
【问题讨论】:
我是 shell 脚本的新手,我正在尝试从以下格式的 txt 文件中读取数据。
A: 1, 2, 3, 4
B: 1,2; 3, 4
这是我的代码:
awk -F':/,/;/ ' '{ echo $2 $3 $4 $5 $5 }' -f 'testread.txt'
我只需要文本文件中的数字。 谢谢。
【问题讨论】:
最简单的方法可能就是让你的字段分隔符“任何不是数字的东西”。
[ghoti@pc ~]$ cat input.txt
A: 1, 2, 3, 4
B: 1,2; 3, 4
[ghoti@pc ~]$ awk -F'[^0-9]+' '{$1=$1; print;}' input.txt
1 2 3 4
1 2 3 4
[ghoti@pc ~]$
$1=$1 位只是强制 awk 使用默认输出字段分隔符重写 $0。
更新:
更明确的输出:
[ghoti@pc ~]$ awk -F'[^0-9]+' '{printf("1=%s 2=%s 3=%s 4=%s 5=%s\n", $1, $2, $3, $4, $5);}' input.txt
1= 2=1 3=2 4=3 5=4
1= 2=1 3=2 4=3 5=4
[ghoti@pc ~]$
【讨论】:
$2、$3 等的值都是原始脚本中的值。 $0 的打印只是为了方便。看到 1 之前的空格了吗?那是字段分隔符,因为您的输入文件中在第一个非数字数据字符串之前没有数字。
你的命令有几个问题。
-F 选项的参数是指定所需分隔符的正则表达式。要选择冒号、逗号或分号作为分隔符,您需要使用竖线,而不是斜线。或者,您可以使用括号表达式。
用于输出文本的 AWK 语句是 print,而不是 echo。
-f 选项用于指定包含 AWK 程序的文件,而不是输入文件。您不需要-f 来指定输入文件。
你想要更像这样的东西:
awk -F '[:,;]' '{ print $2 $3 $4 $5 }' testread.txt
【讨论】: