使用awk、cut或perl选择特定列
我需要从制表符分隔的文件中选择第7列。例如:使用awk、cut或perl选择特定列,perl,unix,sed,awk,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
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
根据输入文件的格式判断,您可以在
-
而不是空格上划界:
awk 'BEGIN{FS="-"} {print $2}' filename
代表字段分隔符,只需将其视为输入的分隔符即可FS
- 鉴于我们现在在
上划界,您之前的第7个字段现在成为第2个字段-
- !!将输入文件
指定为awk的参数filename
或者,如果您的数据字段由选项卡分隔,则可以按如下方式更明确地执行此操作:
awk 'BEGIN{FS="\t"} {print $7}' filename
这将解决此问题,因为
Out全局文档标记
看起来是由空格分隔的。如果数据是明确的制表符分隔的,则cut
将在制表符上剪切,而不是空格:
cut -f7 filename
您当然也可以使用awk
实现这一点:
awk -F'\t' '{ print $7 }'
如果字段由制表符分隔,并且您担心某些字段包含空格,那么这里没有问题,只是:
cut -f 7
(剪切默认为制表符分隔的字段。)这可能适合您(GNU-sed):
此替换命令选择行中的所有内容并返回第七个非制表符。在
sed
中,最后一个按(…)
分组的内容将使用back引用返回到替换的左侧。在这种情况下,第一个反向引用将返回非制表符和制表符(如果存在,请注意?
元字符,该元字符可以是一个进行中的模式,也可以是一个模式,也可以不是一个模式)。*
只会吞掉行中剩余的内容(如果有的话)。。。。和鞭子空格:awk'BEGIN{FS=“[\t]*-[\t]*“}{print$2}”
有时第5列中有数字。它不一定总是一个“-”字。也可以在第4列中改为“-”。@shgnInc替代命令选择行中的所有内容并返回第7个非制表符。在sed中,最后一个按(…)
分组的内容将通过使用反引用在替换的左侧返回。在这种情况下,第一个反向引用将同时返回非制表符和制表符(如果存在,请注意?
元字符,该元字符可以是前面的模式中的一个,也可以是无模式)。*
只会吞掉行中剩余的内容(如果有的话)。
sed -r 's/(([^\t]*)\t?){7}.*/\2/' file