bash中,我想匹配文件的某行,匹配到该行以后,将该行和下面的几行输出到另外一个文件,怎么实现?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bash中,我想匹配文件的某行,匹配到该行以后,将该行和下面的几行输出到另外一个文件,怎么实现?相关的知识,希望对你有一定的参考价值。

cat $1 |while read line
do
echo $line|grep "EXEC"

if [ $? -eq 0 ] ;then
echo $line >>2

fi

done
比如该行没有分号,该行下面的第四行有分号。我想输出这五行到另一个文件。下面的4行怎么也输出到文件2中?

参考技术A

用sed循环匹配输出比较简便,一行代码搞定。

sed -n '/EXEC/:a;p;/;/q;n;ba' $1 >2

稍作说明:

-n         禁止自动打印,只有通过命令p打印。

/EXEC/ 匹配含有EXEC的行。

:a         设置跳转标签a

/;/q       匹配含有分号的行,匹配到了通过命令q退出sed,不再继续向下处理文件。

n          读取下一行

ba        跳转到标签a处向后执行,跟:a组合使用构成循环语句。

 

用你的方法也可以做:

isFound=0
cat $1 | while read line
do
    if [ $isFound -eq 0 ]; then
        echo "$line" | grep "EXEC" >/dev/null 2>&1
        if [ $? -eq 0 ]; then
            isFound=1
            echo "$line" >>2
        fi
    else
        echo "$line" >>2
        echo "$line" | grep ";" >/dev/null 2>&1
        [ $? -eq 0 ] && break
    fi
done

使用 sed / awk / bash 将缺失的行号填充到文件中

【中文标题】使用 sed / awk / bash 将缺失的行号填充到文件中【英文标题】:Fill missing line numbers into file using sed / awk / bash 【发布时间】:2021-07-08 23:57:57 【问题描述】:

我有一个(制表符分隔的)文件,其中每行的第一个“单词”是行号。但是,缺少一些行号。我想插入新行(带有相应的行号),以便在整个文件中,行上打印的数字与实际行号匹配。 (这是为了以后在 readarray 中使用 cut/awk 来获取行号之后的行。)

我已经在 python 中编写了这个逻辑并测试了它的工作原理,但是我需要在没有 python 的环境中运行它。实际文件大约有 10M 行。有没有办法使用 sed、awk 甚至只是普通的 shell / bash 来表示这个逻辑?

linenumre = re.compile(r"^\d+")
i = 0
for line in sys.stdin:
    i = i + 1
    linenum = int(linenumre.findall(line)[0])

    while (i < linenum):
        print(i)
        i = i + 1

    print(line, end='')

测试文件如下:

1   foo 1
2   bar 1
4   qux 1
6   quux    1
9       2
10  fun 2

预期输出如下:

1   foo 1
2   bar 1
3
4   qux 1
5
6   quux    1
7
8
9       2
10  fun 2

【问题讨论】:

1000 万行不是 shell 的工作,不是它做不到,而是需要永远完成 :-) 【参考方案1】:

这样,awk:

awk 'while(++ln!=$1)print ln1' input.txt

解释,作为多行脚本:



    # Loop as long as the variable ln (line number)
    # is not equal to the first column and insert blank
    # lines.

    # Note: awk will auto-initialize an integer variable
    # with 0 upon its first usage

    while(++ln!=$1) 
        print ln
    


1 # this always expands to true, making awk print the input lines

【讨论】:

太棒了,感谢您解释语法!我不知道使用 1 来打印输入行【参考方案2】:

我已经在 python 中编写了这个逻辑并测试了它的工作原理,但是我需要在没有 python 的环境中运行它。

如果您想在未安装 python 的情况下运行 python 代码,您可以冻结您的代码。 The Hitchhiker's Guide to Python 概述了能够做到这一点的工具。我建议先尝试pyinstaller,因为它支持各种操作系统,而且看起来很容易使用。

【讨论】:

【参考方案3】:

这可能对你有用(GNU join、seq 和 join):

join -a1 -t' ' <(seq $(sed -n '$s/ .*//p' file)) file 2>/dev/null

使用file 中的最后一个行号与file 加入由命令seq 创建的文件。

【讨论】:

以上是关于bash中,我想匹配文件的某行,匹配到该行以后,将该行和下面的几行输出到另外一个文件,怎么实现?的主要内容,如果未能解决你的问题,请参考以下文章

C#如何将窗口A中对应的datagridview表格选中某行,然后点击确认按钮,将该行数据录

linux下向一个文件中的某行插入数据的做法

左连接

Vue + Element table中的某行触发enter事件后,使该行disabled

使用 sed / awk / bash 将缺失的行号填充到文件中

MySQL--7种join连接