如何从末尾计数的文本行中剪切(选择)一个字段?


32

我知道如何使用cut命令从一行中选择一个字段。例如,给定以下数据:

a,b,c,d,e
f,g,h,i,j
k,l,m,n,o

该命令:

cut -d, -f2 # returns the second field of the input line

返回值:

b
g
l

我的问题:我怎样才能选择第二场计数从结束了吗?在前面的示例中,结果将是:

d
i
n

Answers:


52

前后反向输入cutrev

<infile rev | cut -d, -f2 | rev

输出:

d
i
n

1
我的bin文件夹中有很多小片段。rcut正是这样:#!/ bin / bash rev | 切“ $ @” | rev
John Allsup

2
太糟糕了cut,不能接受负字段索引(如Python)。
基思·德文斯

10

尝试使用做到这一点:

awk -F, '{print $(NF-1)}' file.txt

或使用

perl -F, -lane 'print $F[-2]' file.txt

或使用(感谢manatwork):

ruby -F, -lane 'print $F[-2]' file.txt

或使用bash(感谢manatwork):

while IFS=, read -ra d; do echo "${d[-2]}"; done < file.txt

或者使用

cat file.txt |
python -c $'import sys\nfor line in sys.stdin:\tprint(line.split(",")[-2])'

1
bash不需要为此固定列数:while IFS=, read -ra d; do echo "${d[-2]}"; done < file.txt
manatwork

1
顺便说一句,如果你改变你的第三个解决方案也适用perlruby
manatwork

谢谢,ruby添加,bash编辑。
吉尔·奎诺

1
如果第4个字段可以以-或(取决于环境,shell或shell的编译方式)开头,则可能包含反斜杠字符,则echo不是一个选择。为什么你需要CON catenate file.txt没有喂养它之前python!?。你需要read -A的,而不是read -aksh93zsh。负下标zsh仅在和的最新版本中ksh93可用bash。在旧版本中,你可以使用${d: -2:1}
斯特凡Chazelas

2
@StephaneChazelas,我想你的意思${d[@]: -2:1}是你的最后一句话。
manatwork

0

使用sed:

sed -E 's/^([^,]*,)*([^,]*)(,[^,]*){1}$/\2/' infile

输出:

d
i
n

说明

  • ([^,]*,)* 匹配任意数量的非逗号字符,后跟一个逗号,即任意数量的列。
  • ([^,]*) 匹配一列。
  • (,[^,]*){1}如果将量词更改为匹配末尾的第二列{1}{2}则匹配末尾的一列,依此类推。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.