例如,我有一个文件:
$ cat filei am the first example.i am the second line.i do a question about a file.
$ cat file
i am the first example.
i am the second line.
i do a question about a file.
我需要:
example, line, file
我的意思是“awk”,但问题是,这些话是在不同的空间
wydwbb8l1#
在普通bash中执行此操作的另一种方法是使用rev命令,如下所示:
rev
cat file | rev | cut -d" " -f1 | rev | tr -d "." | tr "\n" ","
基本上,您反转文件的行,然后使用cut使用空格作为分隔符拆分它们,获取cut生成的第一个字段,然后再次反转标记,使用tr -d删除不需要的字符,再次使用tr将换行符替换为,另外,你可以通过以下方式避免第一只猫:
cut
tr -d
tr
,
rev < file | cut -d" " -f1 | rev | tr -d "." | tr "\n" ","
kgqe7b3p2#
tldr;
$ awk '{print $NF}' file.txt | paste -sd, | sed 's/,/, /g'
对于这样的文件
$ cat file.txtThe quick brown foxjumps overthe lazy dog.
$ 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
", "
g
","
参考文献:
byqmnocz3#
有很多种方法。正如awk解决方案所示,它是一个干净的解决方案,sed的解决方案是删除任何东西,直到最后一个空格。所以如果最后没有空格,sed 's/.* //g' <file>你也可以避免sed,而使用while循环。
awk
sed 's/.* //g' <file>
sed
while
while read linedo [ -z "$line" ] && continue ;echo $line|rev|cut -f1 -d' '|revdone < file
while read line
do [ -z "$line" ] && continue ;
echo $line|rev|cut -f1 -d' '|rev
done < file
它读一行,尊重它,削减第一个(即,最后在原来的)和恢复回来同样可以用纯bash方式来完成
while read linedo [ -z "$line" ] && continue ;echo ${line##* }done < file
echo ${line##* }
这叫做参数展开
k10s72fa4#
如果你想启动一个perl的一行程序作为最后一个单词:perl -lane 'print "$F[-1]"'.其中-a自动分割为@F,$F[-1]是最后一个元素。转换成带逗号的列表:perl -ane 'print "$F[-1]" . (eof() ? "\n":",")'
perl -lane 'print "$F[-1]"'
-a
@F
$F[-1]
perl -ane 'print "$F[-1]" . (eof() ? "\n":",")'
hts6caw35#
上面的都不适合我,下面的是:
grep -o '\S*$' file
whlutmcx6#
尝试
$ awk 'NF>1{print $NF}' fileexample.line.file.
$ awk 'NF>1{print $NF}' file
example.
line.
file.
要像示例中那样在一行中获得结果,请尝试:
{ sub(/\./, ",", $NF) str = str$NF}END { print str }
{
sub(/\./, ",", $NF)
str = str$NF
}
END { print str }
产出:
$ awk -f script.awk fileexample, line, file,
$ awk -f script.awk file
example, line, file,
纯bash:
$ while read line; do [ -z "$line" ] && continue ;echo ${line##* }; done < fileexample.line.file.
$ while read line; do [ -z "$line" ] && continue ;echo ${line##* }; done < file
wyyhbhjk7#
你可以用grep轻松实现:
grep -oE '[^ ]+$' file
(-E使用扩展正则表达式; -o只输出匹配的文本而不是整行)
-E
-o
0qx6xfy68#
你可以在awk中这样做:
awk '{ print $NF }'
编辑:为了避免空行:
awk 'NF{ print $NF }'
8条答案
按热度按时间wydwbb8l1#
在普通bash中执行此操作的另一种方法是使用
rev
命令,如下所示:基本上,您反转文件的行,然后使用
cut
使用空格作为分隔符拆分它们,获取cut
生成的第一个字段,然后再次反转标记,使用tr -d
删除不需要的字符,再次使用tr
将换行符替换为,
另外,你可以通过以下方式避免第一只猫:
kgqe7b3p2#
tldr;
对于这样的文件
给定的命令将打印
工作原理:
awk '{print $NF}'
:打印每行的最后一个字段paste -sd,
:串行读取stdin
(-s
,一次一个文件)并写入逗号分隔的字段(-d,
)sed 's/,/, /g'
:s
在全局上用", "
g
替换","
(适用于所有示例)参考文献:
byqmnocz3#
有很多种方法。正如
awk
解决方案所示,它是一个干净的解决方案,sed的解决方案是删除任何东西,直到最后一个空格。所以如果最后没有空格,
sed 's/.* //g' <file>
你也可以避免
sed
,而使用while
循环。它读一行,尊重它,削减第一个(即,最后在原来的)和恢复回来
同样可以用纯bash方式来完成
这叫做参数展开
k10s72fa4#
如果你想启动一个perl的一行程序作为最后一个单词:
perl -lane 'print "$F[-1]"'
.其中
-a
自动分割为@F
,$F[-1]
是最后一个元素。转换成带逗号的列表:
perl -ane 'print "$F[-1]" . (eof() ? "\n":",")'
hts6caw35#
上面的都不适合我,下面的是:
whlutmcx6#
尝试
要像示例中那样在一行中获得结果,请尝试:
产出:
纯bash:
wyyhbhjk7#
你可以用grep轻松实现:
(
-E
使用扩展正则表达式;-o
只输出匹配的文本而不是整行)0qx6xfy68#
你可以在awk中这样做:
编辑:为了避免空行: