如何在剪切结果(bash)中删除字符串的后缀?

时间:2014-01-04 16:19:58

标签: string bash awk cut

我想在cut命令的所有结果行中删除特定字符“/”后面的所有字符 我怎么能用bash命令呢?

例如cut -f2 file结果:

John.Micheal/22
Erik.Conner/19
Damian.Lewis/40

我需要输出:

John.Micheal
Erik.Conner
Damian.Lewis

4 个答案:

答案 0 :(得分:8)

您可以使用cut作为字段分隔符将其传输到另一个/

cut -f2 file | cut -f1 -d/

或者您可以使用sed来切断/以外的所有内容:

cut -f2 file | sed 's?/.*??'

或者您可以使用带有自定义字段分隔符的单个awk,假设第一个字段中没有/

awk -F'[\t/]' '{print $2}' file

如果第一个字段中可以有/,那么最好使用前两个建议。

答案 1 :(得分:0)

或者使用纯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字分割,另一个使用参数扩展。

答案 2 :(得分:0)

在不知道您的文件内容的情况下,最好将cut -f2 file的结果导出到@janos建议的另一个cutawksed,或者使用@ 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

答案 3 :(得分:0)

只需使用awk就可以了:

awk -F'\t' '{split($2,a,"/"); print a[1]}' file

如果前2个字段中没有其他“/”,则可以缩减为:

awk -F'[\t/]' '{print $2}' file