如何使用“cut”找到最后一个字段
- 2024-10-14 08:39:00
- admin 原创
- 69
问题描述:
如果不使用sed
或awk
,仅使用 cut
,当字段数量未知或每行都在变化时,如何获取最后一个字段?
解决方案 1:
您可以尝试这样的事情:
echo 'maps.google.com' | rev | cut -d'.' -f 1 | rev
解释
rev
将“maps.google.com”反转为moc.elgoog.spam
cut
使用点(即“。”)作为分隔符,并选择第一个字段,即moc
最后,我们再次反转得到
com
解决方案 2:
cut
使用参数扩展。这比任何类型的外部命令(或)都更有效率grep
。
data=foo,bar,baz,qux
last=${data##*,}
请参阅BashFAQ #100了解有关 bash 中本机字符串操作的介绍。
解决方案 3:
仅使用 是不可能的cut
。以下是使用 的方法grep
:
grep -o '[^,]*$'
用其他分隔符替换逗号。
解释:
-o
(--only-matching
) 仅输出输入中与模式匹配的部分(默认如果包含匹配则打印整行)。[^,]
是与除逗号之外的任意字符匹配的字符类。*
与前面的模式匹配零次或多次,因此[^,]*
匹配零个或多个非逗号字符。$
匹配字符串的结尾。综合起来,该模式匹配字符串末尾的零个或多个非逗号字符。
当有多个可能的匹配时,
grep
优先选择最早开始的那个。因此整个最后一个字段都会被匹配。
完整示例:
如果我们有一个名为data.csv的文件,其中包含
one,two,three
foo,bar
然后grep -o '[^,]*$' < data.csv
会输出
three
bar
解决方案 4:
没有 awk?但是用 awk 很简单:
echo 'maps.google.com' | awk -F. '{print $NF}'
AWK 是一款功能更强大的工具。
-F为字段分隔符
$NF变量是字段的数量(也代表最后一个的索引)
解决方案 5:
有多种方法。你也可以使用这个。
echo "Your string here"| tr ' ' '
' | tail -n1
> here
显然,tr 命令的空格输入应该替换为您所需要的分隔符。
解决方案 6:
这是只使用 cut 的唯一可能解决方案:
回显“字符串”| 剪切-d'。'-f2-
[重复以下部分直到内存不足:] | 剪切-d'。'-f2-
使用此解决方案,字段数量确实可以未知且会随时间变化。但是,由于行长不得超过 LINE_MAX 个字符或字段(包括换行符),因此任意数量的字段永远不能成为此解决方案的实际条件。
是的,这是一个非常愚蠢的解决方案,但我认为这是唯一符合标准的解决方案。
解决方案 7:
在处理表格数据时最好使用awk
。如果可以通过 实现awk
,为什么不使用它呢?我建议您不要浪费宝贵的时间,使用一些命令来完成工作。
例子:
# $NF refers to the last column in awk
ll | awk '{print $NF}'
解决方案 8:
如果您的输入字符串不包含正斜杠,那么您可以使用basename
子shell:
$ basename "$(echo 'maps.google.com' | tr '.' '/')"
这没有使用sed
orawk
但也没有使用cut
either,所以我不太确定它是否有资格作为问题的答案。
如果处理包含正斜杠的输入字符串,这种方法效果不佳。针对这种情况的解决方法是将正斜杠替换为您知道不是有效输入字符串的其他字符。例如,|
文件名中也不允许使用竖线 ( ) 字符,因此这样做会有效:
$ basename "$(echo 'maps.google.com/some/url/things' | tr '/' '|' | tr '.' '/')" | tr '|' '/'
解决方案 9:
使用 perl 的另一种方法是:
perl -pe 's/(.*) (.*)$/$2/' file
您可以
在其中更改分隔file
符
解决方案 10:
以下实现朋友的建议
#!/bin/bash
rcut(){
nu="$( echo $1 | cut -d"$DELIM" -f 2- )"
if [ "$nu" != "$1" ]
then
rcut "$nu"
else
echo "$nu"
fi
}
$ export DELIM=.
$ rcut a.b.c.d
d
解决方案 11:
假设您有一个名为 filelist.txt 的文件,其中列出如下路径:c:/dir1/dir2/file1.h c:/dir1/dir2/dir3/file2.h
然后你可以这样做:rev filelist.txt | cut -d“/” -f1 | rev
解决方案 12:
只是为了好玩而添加一种方法来解决这个老问题:
$ cat input.file # file containing input that needs to be processed
a;b;c;d;e
1;2;3;4;5
no delimiter here
124;adsf;15454
foo;bar;is;null;info
$ cat tmp.sh # showing off the script to do the job
#!/bin/bash
delim=';'
while read -r line; do
while [[ "$line" =~ "$delim" ]]; do
line=$(cut -d"$delim" -f 2- <<<"$line")
done
echo "$line"
done < input.file
$ ./tmp.sh # output of above script/processed input file
e
5
no delimiter here
15454
info
除了 bash 之外,只有 cut 可用。嗯,我想还有 echo。
解决方案 13:
choose -1
choose支持负索引(其语法类似于 Python 的切片)。
解决方案 14:
我意识到,只要确保尾部分隔符存在,它就可以正常工作。所以在我的例子中,我有逗号和空格分隔符。我在末尾添加了一个空格;
$ ans="a, b"
$ ans+=" "; echo ${ans} | tr ',' ' ' | tr -s ' ' | cut -d' ' -f2
b
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件