Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用awk、cut或perl选择特定列_Perl_Unix_Sed_Awk - Fatal编程技术网

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

使用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

我需要从制表符分隔的文件中选择第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

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

awk 'BEGIN{FS="-"} {print $2}' filename
  • FS
    代表字段分隔符,只需将其视为输入的分隔符即可
  • 鉴于我们现在在
    -
    上划界,您之前的第7个字段现在成为第2个字段
  • !!将输入文件
    filename
    指定为awk的参数

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

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