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中?
用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=0cat $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表格选中某行,然后点击确认按钮,将该行数据录
Vue + Element table中的某行触发enter事件后,使该行disabled