我需要从制表符分隔文件中选择第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
答案 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个字段。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 ?
元字符,其中一个或任何一个正在进行的模式)。.*
只是吞下了线上留下的东西。