使用awk或cut或perl选择特定列

时间:2012-12-10 04:53:15

标签: perl unix sed awk

我需要从制表符分隔文件中选择第7列。例如:

cat filename | awk '{print $7}'

问题是第4列中的数据有多个值,中间有空白。示例 - 以下输出中的最后一行:

user  \Adminis FL_vol Design         0         -       1       -
group        0 FL_vol Design   19324481         -    3014       -
user      \MAK FL_vol Design   16875161         -    2618       -
tree       826 FL_vol Out Global Doc Mark     16875162         -    9618       - /vol/FL_vol/Out Global Doc Mark

4 个答案:

答案 0 :(得分:18)

如果数据明确地以制表符分隔,则cut将剪切选项卡,而不是空格:

cut -f7 filename

您当然可以使用awk执行此操作:

awk -F'\t' '{ print $7 }'

答案 1 :(得分:5)

如果字段由制表符分隔,并且您担心某些字段包含空格,则此处没有问题,只是:

cut -f 7

(剪切默认为制表符分隔的字段。)

答案 2 :(得分:2)

根据输入文件的格式判断,您可以在-而不是空格上分隔:

awk 'BEGIN{FS="-"} {print $2}' filename
  • FS代表Field Separator,只是将其视为输入的分隔符。
  • 鉴于我们现在正在-分隔,您之前的第7个字段将成为第2个字段。
  • Save a cat!指定输入文件filename作为awk的参数。

或者,如果您的数据字段由制表符分隔,则可以按如下方式更明确地执行此操作:

awk 'BEGIN{FS="\t"} {print $7}' filename

这将解决问题,因为Out Global Doc Mark看起来被空格隔开。

答案 3 :(得分:1)

这可能适合你(GNU sed):

sed -r 's/(([^\t]*)\t?){7}.*/\2/' file

此替换命令选择行中的所有内容并返回第7个非制表符。在sed中,按(...)分组的最后一项将通过使用反向引用在替换的左侧返回。在这种情况下,第一个反向引用将返回非制表符和制表符(如果存在NB ?元字符,其中一个或任何一个正在进行的模式)。.*只是吞下了线上留下的东西。