回显到存在特定字符串的行上方的行

  • 本文关键字:字符串 存在 bash
  • 更新时间 :
  • 英文 :


我正在使用一个for f in $(cat /dir/file)嵌套循环,里面有一个条件来测试if (($f=$z))zfor z in $(cat /dir/file2)循环中,f循环嵌套在其中。 我想知道是否可以写入$z字符串在file2行上方的行,如果$z=$f.file2中的每一行都是一个 5 位数字,例如 07732,如果有一行 07732 在file我想在文件 07732 所在的行上方写下该行 2 是

我现在得到的是

for z in $(cat /dir/file2)
do
for f in $(cat /dir/file)
do
if (( $f=$z ))
then
(what im asking about)
i=0
break
else
i=1
fi
done
if ((i=1))
then
......

我知道我有语法错误,不需要纠正这些错误。 对不起,如果我解释得很差,请告诉我是否需要更详细地解释

延迟匹配行的输出。而且,正如查尔斯·达菲(Charles Duffy)在表扬中指出的那样,不要阅读带有for的台词。另请注意,您将读取file1 的每一行的整个 file2。如果 file2 的大小很大,这可能会非常慢。如果 file2 非常小,请将其读入数组。

此外,还应使用有意义的变量名称。这不是 1970 年代的 BASIC,您仅限于单个字符。

下面是一些示例代码,其中包含大部分内容,但保留内部 while 循环而不是使用数组:

while read -r file1_line
do
while read -r -u 3 file2_line
do
if [[ $file2_line == $file1_line ]]
then
echo "some special putput"
i=0
break
else
i=1
fi
done 3< /path/to/file2
echo "NOW I'm echoing $file1_line"
if (( i == 1 ))
then
. . .
fi
done < /path/to/file1

这将回显文件一中的行,但是当存在匹配项时,它将回显匹配行之前的字符串。

内部while循环使用额外的文件描述符,以便能够在外部循环从 STDIN 文件描述符读取时从第二个文件读取。这样就可以同时独立读取多个文件。-u 3告诉read使用文件描述符 3。3<重定向将 file2 的内容放在文件描述符 3 上,以便可以在那里读取它们。