如何使用linux命令从另一个文件中创建一个只包含小写字样的新文件?

时间:2017-04-21 12:51:18

标签: linux bash shell

更确切地说,我必须编写一个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 

6 个答案:

答案 0 :(得分:0)

你的问题有点含糊不清。

目前还不清楚您是否要移动字符串从file1.txtfile2.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,如果您想在输出中的不同行上foobar ),但如果这是可以接受的,那么通常预先处理数据以将所有单词放在他们自己的行上。请记住,此解决方案对此问题采取了非常天真的方法,并假设空格表示单词边界,但您可以根据需要轻松修改。基本上,您将每个单词放在自己的行上,然后逐行解决问题:

< 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

希望这有帮助!