【发布时间】:2014-01-22 06:59:02
【问题描述】:
我想删除cut 命令的所有结果行中特定字符“/”之后的所有字符
我该如何使用 bash 命令来做到这一点?
例如,如果cut -f2 file 结果:
John.Micheal/22
Erik.Conner/19
Damian.Lewis/40
我需要这个输出:
John.Micheal
Erik.Conner
Damian.Lewis
【问题讨论】:
我想删除cut 命令的所有结果行中特定字符“/”之后的所有字符
我该如何使用 bash 命令来做到这一点?
例如,如果cut -f2 file 结果:
John.Micheal/22
Erik.Conner/19
Damian.Lewis/40
我需要这个输出:
John.Micheal
Erik.Conner
Damian.Lewis
【问题讨论】:
您可以使用/ 作为字段分隔符将其通过管道传送到另一个cut:
cut -f2 file | cut -f1 -d/
或者您可以使用sed 切断/ 之外的所有内容:
cut -f2 file | sed 's?/.*??'
或者您可以使用带有自定义字段分隔符的单个 awk,假设第一个字段中没有 /:
awk -F'[\t/]' '{print $2}' file
如果第一个字段可以有/,那么最好使用前两个建议。
【讨论】:
awk 命令假定第一个制表符分隔字段中没有/。
或者使用纯 bash while 循环逐行读取到 shell 变量中。一种选择:
cut -f2 file | while IFS=/ read -r a _; do echo "$a"; done
另一种选择:
cut -f2 file | while read -r a; do echo "${a%/*}"; done
第一个在读取时使用IFS分词,另一个使用参数扩展。
【讨论】:
在不知道你的文件是什么样子的情况下,最好按照@janos 的建议将cut -f2 file 的结果通过管道传递给另一个cut 或awk 或sed,或者使用@kastelian 的方法
因为cut -f2 file给了你
John.Micheal/22
Erik.Conner/19
Damian.Lewis/40
我猜这就是你的原始文件的样子
ab/c John.Micheal/22 abc/23
de Erik.Conner/df abc
Damian.Lewis/40 def/999
而不是cut 和管道输出到另一个命令,你可以直接得到结果
获取第一个制表符和第一个/之后制表符之间的字符串
sed 's@^[^\t]*[\t]\+\([^/]\+\)/.*@\1@' file
或者如果你有 GNU sed
sed -r 's@^[^\t]*[\t]+([^/]+)/.*@\1@' file
【讨论】:
只需使用 awk 即可:
awk -F'\t' '{split($2,a,"/"); print a[1]}' file
如果您的前 2 个字段中没有其他“/”,那么您可以简化为:
awk -F'[\t/]' '{print $2}' file
【讨论】: