Arrays 当一个单词存在于多个文件中时,如果缺少该单词,请检入命令行

Arrays 当一个单词存在于多个文件中时,如果缺少该单词,请检入命令行,arrays,shell,for-loop,grep,Arrays,Shell,For Loop,Grep,当一个单词(在我的示例中是第二个单词)丢失,而另一个单词(在ma示例中是第一个单词)被写入时,我如何能有一个列表来告诉我该单词何时丢失 File1.txt: 你好,第一个字。。。副词 。。。第一个字 第一个字。。。副词 第一句话 你好。。。副词 File2.txt: 你好,第一个字。。。副词 第一个字 我希望在结尾处有一个带有行和文件名的文件: 3:File1 5:File1 2:File2 我认为我试图做的是过度杀戮:/ filename='test.txt' lineArray[0]

当一个单词(在我的示例中是第二个单词)丢失,而另一个单词(在ma示例中是第一个单词)被写入时,我如何能有一个列表来告诉我该单词何时丢失

File1.txt:

你好,第一个字。。。副词

。。。第一个字

第一个字。。。副词

第一句话

你好。。。副词

File2.txt:

你好,第一个字。。。副词

第一个字

我希望在结尾处有一个带有行和文件名的文件:

3:File1

5:File1

2:File2

我认为我试图做的是过度杀戮:/

   filename='test.txt'
lineArray[0]=0
filesAwaitable[0]=$lineArray
grep -r -n 'FirstWord ' Sources/ --include=\*.txt | awk -F: '{print $2":"$1}' > $filename
while read line; 
    do 
        IFS=:
        ary=($line)
        for key in "${!ary[@]}";
            do
                if [[ $filesAwaitable["$key"] != *"${ary[$key]}"* ]]; then
                    filesAwaitable["$key"] = "${ary[$key]}"
                    echo "${ary[$key]}";
                fi
                
                #grep -n -r 'SecondWord' line | awk -F: '{print $2":"$1}'
                
            done
    done < $filename
filename='test.txt'
线性阵列[0]=0
filesAwaitable[0]=$lineArray
grep-r-n'FirstWord'Sources/--include=\*.txt | awk-F:“{print$2”:“$1}”>$filename
读行时;
做
如果=:
ari=($line)
对于“${!ary[@]}”中的键;
做
如果[[$filesAwaitable[“$key”]!=*“${ary[$key]}”*];然后
filesAwaitable[“$key”]=“${ary[$key]}”
回显“${ary[$key]}”;
fi
#grep-n-r'SecondWord'行| awk-F:“{print$2”:“$1}”
完成
完成<$filename
谢谢你的帮助

在我的示例中,我想知道第二个单词何时丢失,而第一个单词以前已经写过了

如果您有一个理解perl正则表达式的
grep
,您可以直接为FirstWord指定一个模式,直到行尾,在任何地方都不能后跟SecondWord:

对于给定的示例,这将产生:

File1.txt:3:... FirstWord ...
File1.txt:5:FirstWord ... ...
File2.txt:2:FirstWord ...
要将其重新排列为所需的输出格式,您可以通过管道将其传送

awk -F: '{print $2,":",$1}'
在我的示例中,我想知道第二个单词何时丢失,而第一个单词以前已经写过了

如果您有一个理解perl正则表达式的
grep
,您可以直接为FirstWord指定一个模式,直到行尾,在任何地方都不能后跟SecondWord:

对于给定的示例,这将产生:

File1.txt:3:... FirstWord ...
File1.txt:5:FirstWord ... ...
File2.txt:2:FirstWord ...
要将其重新排列为所需的输出格式,您可以通过管道将其传送

awk -F: '{print $2,":",$1}'

如果Perl解决方案还可以,下面是一个简单的解决方案,其正则表达式与GNU grep相同:

perl -ne 'print "$. : $ARGV\n" if /FirstWord((?!SecondWord).)*$/; close ARGV if eof' File?.txt
如何在所有源/文件夹中为所有.txt文件使用此命令

您可以为此使用
find

find Source -name \*.txt|xargs perl …

(在
perl
命令的末尾没有
文件?.txt

如果perl解决方案没有问题,下面是一个简单的解决方案,其正则表达式与GNU grep相同:

perl -ne 'print "$. : $ARGV\n" if /FirstWord((?!SecondWord).)*$/; close ARGV if eof' File?.txt
如何在所有源/文件夹中为所有.txt文件使用此命令

您可以为此使用
find

find Source -name \*.txt|xargs perl …

(在
perl
命令的末尾没有
File?.txt

如果shell是
bash
,这个问题可以通过操作员
轻松解决!(模式)
,它匹配除给定模式之外的任何内容:

shopt-s extglob#启用扩展模式匹配功能
对于“$@”中的文件
do lineno=0
读行时
do(++行号))
*第一个单词中的大写“$line”!(*SecondWord))echo$lineno:$file
以撒

完成如果shell是
bash
,则问题可以通过操作员
轻松解决!(模式)
,它匹配除给定模式之外的任何内容:

shopt-s extglob#启用扩展模式匹配功能
对于“$@”中的文件
do lineno=0
读行时
do(++行号))
*第一个单词中的大写“$line”!(*SecondWord))echo$lineno:$file
以撒


完成示例中的
File1.txt
哪一行是第5行?哪个词是遗漏的词,哪个词是另一个词?您好,我编辑我的问题以更好地缩进。在我的例子中,我想知道第二个单词什么时候丢失,第一个单词以前写过。Thx,你是对的。请问您的示例
File1.txt
中的哪一行是第5行?哪个词是遗漏的词,哪个词是另一个词?您好,我编辑我的问题以更好地缩进。在我的例子中,我想知道第二个单词什么时候丢失,第一个单词以前写过。Thx,你是对的。DoneThx Armali,什么是-P?用一行字来表达似乎很完美。但事实并非如此work@B.Brigitte-
-P
-perl regexp
˿将模式解释为perl正则表达式。此选项在GNU grep中可用;也许你可以安装它,或者我会考虑一种没有它的方法(但那会更复杂,类似于你的-或者你可以使用
perl
?)。Thx Armali,什么是-P?用一行字来表达似乎很完美。但事实并非如此work@B.Brigitte-
-P
-perl regexp
˿将模式解释为perl正则表达式。此选项在GNU grep中可用;也许你可以安装它,或者我会考虑一种没有它的方法(但那会更复杂,与你的方法类似-或者你可以使用
perl
?)。这看起来很完美,谢谢。我不得不用-nle替换,因为grep-P不再工作了。如何在所有源/文件夹中为所有.txt文件使用此命令?@B.Brigitte-将
文件.txt
替换为
子文件夹/*.txt
应足以使其在子文件夹中的所有txt文件中显示。子文件夹中我不知道的子文件夹如何?如果该子文件夹中没有txt文件,则子文件夹/*.txt。这会造成很多错误。没有你我就做不到。谢谢你的病人这看起来很完美,谢谢。我不得不用-nle替换,因为grep-P不再工作了。如何在所有源/文件夹中为所有.txt文件使用此命令?@B.Brigitte-将
文件.txt
替换为
子文件夹/*.txt
应足以使其在子文件夹中的所有txt文件中显示。子文件夹中我不知道的子文件夹如何?如果该子文件夹中没有txt文件,则子文件夹/*.txt。这会造成很多错误。没有你就不行