24

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

4 回答 4

26

如果数据是明确的制表符分隔的,那么cut将在制表符上剪切,而不是空格:

cut -f7 filename

您当然也可以使用 来做到这awk一点:

awk -F'\t' '{ print $7 }'
于 2012-12-10T05:36:40.153 回答
6

如果字段由制表符分隔,并且您担心某些字段包含空格,那么这里没有问题,只需:

cut -f 7

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

于 2012-12-10T05:38:31.050 回答
4

从输入文件的格式来看,您可以使用分隔-而不是空格:

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

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

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

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

于 2012-12-10T04:57:35.053 回答
1

这可能对您有用(GNU sed):

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

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

于 2012-12-10T07:30:15.873 回答