更确切地说,我必须编写一个shell脚本,它将只包含小写的单词从一个文件移动到另一个文件。新文件中的单词必须按字母顺序排序,并且必须删除重复的行。
直到现在我试过了:
grep -E '^\b[a-z]*[a-z]\b' file1.txt | sort -V | cat > file2.txt | awk ' !seen[$0]++' file2.txt
FILE1.TXT:
aaaAaa B
aaccc c
aP ppp
aAaaA
aa
aAaa
AAa
aa
file2.txt将是:
aa
aa
aaccc c
终端将打印:
aa
aaccc c
答案 0 :(得分:0)
你的问题有点含糊不清。
目前还不清楚您是否要移动字符串从file1.txt
到file2.txt
,或者只是从file1.txt
提取/复制匹配的字符串到{ {1}}。
您还声明要匹配小写字词,但您的示例建议您要匹配仅包含小写字母和可选空格的任何文本行。
假设您只想提取(而不是移动)匹配的字符串,并且您希望将任何只包含小写字符的行与可选空格匹配,那么这应该是您想要的:
file2.txt
您应该得到以下结果:
egrep '^[a-z[:space:]]+$' file1.txt | grep '[a-z]' | sort | tee file2.txt | uniq
或者,如果您对小写单词更感兴趣,(与仅包含小写或空格的整行相比),那么您将需要以下内容:
nicolaw@host:~ $ cat file1.txt
aaaAaa B
aaccc c
aP ppp
aAaaA
aa
aAaa
AAa
aa
nicolaw@host:~ $ egrep '^[a-z[:space:]]+$' file1.txt | grep '[a-z]' | sort | tee file2.txt | uniq
aa
aaccc c
nicolaw@host:~ $ cat file2.txt
aa
aa
aaccc c
nicolaw@host:~ $
哪个应该输出这样的东西:
egrep -ow '[a-z]+' file1.txt | sort | tee file2.txt | uniq
答案 1 :(得分:0)
awk 方法
awk '/^[a-z ]*$/' file1.txt | sort | uniq > file2.txt
示例输出:
cat file2
aa
aaccc c
答案 2 :(得分:0)
for w in `cat startingFile`; do x=`echo $w | sed -r 's@[a-z]+@@g'`; if (( ${#w} > 0 && ${#x} == 0 )); then echo $w; fi; done | sort | uniq > allDone
当我发布时,严重的口音,引人注目的引号没有显示。他们属于" cat startingFile"和"回显$ w | sed -r' s @ [a-z] + @@ g'"
答案 3 :(得分:0)
根据您的评论,您对所有小写但不是单词的行不感兴趣,我认为如下所示的awk
解决方案会让您关闭:
$ cat infile.txt
aaaAaa B
aaccc c
aP ppp
aAaaA
aa
aAaa
AAa
aa
$ awk '{for (i=1;i<=NF;i++){ if ($i~/^[a-z]*$/){print $i}}}' infile.txt | sort -uV
aa
aaccc
c
ppp
您也可以将输出写入awk脚本中的文件:
awk '{for (i=1;i<=NF;i++){ if ($i~/^[a-z]*$/){print $i ; print $i > "outfile.txt"}}}' infile.txt | sort -uV
此脚本循环遍历行中的每个字段/单词,并使用正则表达式测试所有小写字母。结果以自己的行打印,并且全部通过sort
标记为u
unique
。
答案 4 :(得分:0)
我不清楚您是否要保留原始行号(例如,如果输入为foo bar
,如果您想在输出中的不同行上foo
和bar
),但如果这是可以接受的,那么通常预先处理数据以将所有单词放在他们自己的行上。请记住,此解决方案对此问题采取了非常天真的方法,并假设空格表示单词边界,但您可以根据需要轻松修改。基本上,您将每个单词放在自己的行上,然后逐行解决问题:
< file1.txt tr ' ' \\n | grep '^[a-z]*$' | sort -u
Otoh,您可以稍微修改一下您使用的内容并使用:
grep -Eo '\b[a-z]+\b' file1.txt
或
grep -Eow '[a-z]+' file1.txt
答案 5 :(得分:0)
grep
命令有一个非常方便的选项-v
,用于选择不匹配模式的记录。因此,考虑到这一点,这将为您提供输出文件:
grep -v "[A-Z]" file1.txt |sort > file2.txt
这是一个示例运行,添加了显示内容sans dups:
StackOverflow> cat file1.txt
aaaAaa B
aaccc c
aP ppp
aAaaA
aa
aAaa
AAa
aa
StackOverflow> grep -v "[A-Z]" file1.txt |sort > file2.txt
StackOverflow> cat file2.txt
aa
aa
aaccc c
StackOverflow> cat file2.txt | sort -u
aa
aaccc c
StackOverflow>
第一个命令只显示file1.txt
中的内容。下一个命令使用grep
查找没有大写字母的所有行(-v
选项)和管道,用于排序将其写入file2.txt
的行。我展示了该文件中的内容,然后使用sort
再次删除重复项。
请注意,要完成您想要的任务,您只需要两行:
grep -v "[A-Z]" file1.txt |sort > file2.txt
cat file2.txt | sort -u
编辑:我专注于sort
命令,并没有考虑第二行更好的uniq
选项。您可以这样做,而不是使用sort -u
:
uniq file2.txt
制作整个shebang:
grep -v "[A-Z]" file1.txt |sort > file2.txt
uniq file2.txt
希望这有帮助!