例如我有一个文件:
$ cat file
i am the first example.
i am the second line.
i do a question about a file.
我需要:
example, line, file
我打算使用“ awk”,但问题是单词在不同的空间
Answers:
尝试
$ awk 'NF>1{print $NF}' file
example.
line.
file.
要像您的示例一样在一行中获得结果,请尝试:
{
sub(/\./, ",", $NF)
str = str$NF
}
END { print str }
输出:
$ awk -f script.awk file
example, line, file,
纯重击:
$ while read line; do [ -z "$line" ] && continue ;echo ${line##* }; done < file
example.
line.
file.
$NF
”?
##
在外壳中搜索或尝试即可。
您可以使用grep轻松做到这一点:
grep -oE '[^ ]+$' file
(-E
使用扩展的正则表达式;-o
仅输出匹配的文本,而不输出整行)
grep -oE '[^ ]+$'
,由于浏览器的行为,您希望在此处看到选项卡,但是无论如何,这也应考虑选项卡空间,或者更好的是,您可以这样做grep -oE '[^[:space:]]+$'
在纯bash中执行此操作的另一种方法是使用如下rev
命令:
cat file | rev | cut -d" " -f1 | rev | tr -d "." | tr "\n" ","
基本上,您反转文件的行,然后cut
使用空格作为定界符来分割它们,取cut
产生的第一个字段,然后再次反转令牌,用于tr -d
删除不需要的字符,并tr
再次用替换换行字符,
另外,您可以执行以下操作避免遇到第一只猫:
rev < file | cut -d" " -f1 | rev | tr -d "." | tr "\n" ","
有很多方法。如awk
解决方案所示,这是干净的解决方案
sed解决方案是删除所有内容,直到最后一个空格为止。因此,如果最后没有空间,它应该可以工作
sed 's/.* //g' <file>
你能避免sed
也走了一个while
循环。
while read line
do [ -z "$line" ] && continue ;
echo $line|rev|cut -f1 -d' '|rev
done < file
它读取一行,对其进行崇敬,剪下第一行(即原始行中的最后一行)并还原
可以用纯重的方式完成同样的操作
while read line
do [ -z "$line" ] && continue ;
echo ${line##* }
done < file
称为参数扩展
tldr;
$ awk '{print $NF}' file.txt | paste -sd, | sed 's/,/, /g'
对于这样的文件
$ cat file.txt
The quick brown fox
jumps over
the lazy dog.
给定的命令将打印
fox, over, dog.
这个怎么运作:
awk '{print $NF}'
:打印每行的最后一个字段paste -sd,
:顺序读取stdin
(-s
,一次读取一个文件),并写入以逗号分隔的字段(-d,
)sed 's/,/, /g'
:s
ubstitutes","
与", "
g
lobally(所有实例)参考文献: