Bash 如何在每行输入中找到唯一字符?

Bash 如何在每行输入中找到唯一字符?,bash,awk,sed,grep,perl,Bash,Awk,Sed,Grep,Perl,有没有办法提取每行的唯一字符 我知道我可以使用 sort -u file 我想确定每行的唯一字符(类似于每行的sort-u) 澄清:鉴于此输入: 111223234213 111111111111 123123123213 121212122212 我希望获得以下输出: 1234 1 123 12 它不能按原来的顺序进行操作,但这个awk one liner似乎可以工作: awk '{for(i=1;i<=length($0);i++){a[substr($0,i,1)]=1} fo

有没有办法提取每行的唯一字符

我知道我可以使用

sort -u file
我想确定每行的唯一字符(类似于每行的
sort-u

澄清:鉴于此输入:

111223234213
111111111111
123123123213
121212122212
我希望获得以下输出:

1234
1
123
12

它不能按原来的顺序进行操作,但这个awk one liner似乎可以工作:

awk '{for(i=1;i<=length($0);i++){a[substr($0,i,1)]=1} for(i in a){printf("%s",i)} print "";delete a}' input.txt
awk'{for(i=1;i此awk应该工作:

awk -F '' '{delete a; for(i=1; i<=NF; i++) a[$i]; for (j in a) printf "%s", j; print ""}' file
1234
1
123
12
另一个解决方案

while read line; do 
  grep -o . <<< $line | sort -u | paste -s -d '\0' -;
done < file
读取行时;执行以下操作
grep-o.单向使用:

结果:

1234
1
123
12
这可能适用于您(GNU-sed):

将每行拆分为一系列行。对这些行进行唯一排序。将结果合并回一行。

使用sed

sed ':;s/\(.\)\(.*\)\1/\1\2/;t' file
基本上,它所做的是捕获一个字符,并检查它是否出现在行中的任何其他位置。它还捕获这些字符之间的所有字符。 然后,它用第一次出现取代了所有这些,包括第二次出现,然后是中间发生的

t
是测试,如果上一个命令成功,则跳到
标签。然后重复此操作,直到
s//
命令失败,这意味着只剩下唯一字符

只是分隔命令

1234
1
123
12

同时保持秩序。

使用sed和gnu工具,与其他工具相比,具有独特性和可排序性:

sed 's/\(.\)/\1\n/g' file | sort | uniq
每行生成一个字符;如果希望这些字符位于一行上,只需执行以下操作:

sed 's/\(.\)/\1\n/g' file | sort | uniq | sed ':a;N;$!ba;s/\n//g;'

这具有按排序顺序而非外观顺序显示字符的优点。

创新解决方案!作为参考,管道中的第一个sed脚本可以缩短为
's//&/g'
。并且
排序| uniq
通常可以替换为
排序-u
。此外,如果其中一个字符是trimm呢在线上的ed实际上是一个空间?不客气。哦,在你的sed脚本中要小心
\n
。你现在使用的是GNU sed,但不是FreeBSD、OSX、Solaris等中的sed。如果你写的东西是不可移植的,最好注意这个事实,或者像anubhava使用他的GAWK soluti那样提供替代方案on.你的脚本越来越短了!:-D做得好,这看起来不错。作为参考,比
awk
稍微轻一点的重新组装输出的方法可能是:
paste-s-D'\0'-
。这也可以消除
echo
生成新行的需要。@ghoti再次感谢,你说得对粘贴效果更好…我喜欢使用StackOverflow来学习我一直对perl很感兴趣,但它对我来说很少有意义。你能解释一下它是如何工作的吗?太好了!你能解释一下这部分吗
s/*/echo“&”
@user1436187有关
e
命令,请参阅。它允许在当前shell中计算模式空间,并将结果放回模式空间。这更短!什么是
:;
t
做什么?@user1436187添加了解释这可以缩短,而且可能更快:
sed':;s/\(\(.\).\)\2/\1/g'文件
。但是应该记住,它删除了重复的符号,但没有对它们进行排序。@poton这对我不起作用。我也看不出它是如何工作的,或者为什么前面有一个标签,但没有跳转到它。你能解释一下命令吗?我的错误
sed':;s/\(\(.\)\2/\1/g;t'文件
sed 's/\B/\n/g;s/.*/echo "&"|sort -u/e;s/\n//g' file
sed ':;s/\(.\)\(.*\)\1/\1\2/;t' file
1234
1
123
12
sed 's/\(.\)/\1\n/g' file | sort | uniq
sed 's/\(.\)/\1\n/g' file | sort | uniq | sed ':a;N;$!ba;s/\n//g;'