我有一个文本文件名coalitions.txt
,它看起来像这样:
Hadash left
Balad left
Raam_Taal left
Meretz left
Shas right
Habait_Hayehudi right
Haihud_Haleumi right
Yehadut_Hatorah right
Liberman right
Avoda left
Kadima center
Likud right
我想打印每行中最后一个单词的列表,没有重复项。输出应为:
left
right
center
我知道我可以使用许多技术,例如tail
但我想知道为什么我所做的不起作用......我试过这个:
cat coalitions.txt | sed 's/.*[[:space:]]+([A-Z][a-z]+)/1/' | sort | uniq
但它只是再次打印相同的列表,就好像我的sed
不起作用一样。为什么会这样?
使用正确的工具完成工作:
$ awk '!z[$NF]++ {print $NF}' coalitions.txt
left
right
center
这里
[A-Z][a-z]+
是"A-Z 中的一个,后跟一个或多个 A-Z"。你的意思可能是[A-Za-z]
,甚至更好,不容易受到区域设置变化的影响,[[:alpha:]]
。
我只会像这样提取每行的最后一个单词:
sed 's/.*[[:space:]]([^[:space:]]*)$/1/' coalitions.txt | sort -u
不需要单独的cat
,sort | uniq
和sort -u
一样。
我认为 sed 无法将 + 识别为 1 个或多个元字符。 你可以试试这个。
cat coalitions.txt | sed 's/.* ([A-Za-z][A-Za-z]*)/1/' | sort | uniq
cat coalitions.txt | sed 's/.*s+([A-Za-z]+)/1/'
这似乎奏效了。 由于我在窗户上,我必须使用s
而不是[[:space:]]
。 但即使我只是更改空间并尝试:
cat coalitions.txt | sed 's/.*s+([A-Z][a-z]+)/1/'
它不起作用。 问题是字符范围必须使用逗号而不是单独的括号。 [A-Za-z]