shell 有条件地将某些行从一个文件写入另一个文件

kxeu7u2r  于 2022-12-23  发布在  Shell
关注(0)|答案(1)|浏览(389)

我有一个文本文件(固定宽度),格式如下:

a1   b   c1    d     -> header
1    2    3    4
6    4    3    5
a2   b    c2   d2    -> header
7    9    1    4
a    b1   c6   d2    -> header
8    9    3    4

我想从这个文件中创建另一个包含筛选行的文件。如果c列的值为3,并且b列的值不是2,那么我想让该行包含标题。如果c列的值不是3,那么我不想让任何行包含标题。因此,新文件必须如下所示:

a1   b   c1    d
6    4    3    5
a    b1   c6   d2
8    9    3    4

另外,值3只能出现在c的列中,值2只能出现在b的列中。因此,我们甚至不必检查列,只要行中满足筛选条件。唯一重要的是,如果满足条件,我还需要该行的标题。如果不满足条件,我也不需要该行的标题。
如何才能做到这一点?
我所尝试的是用.read_fwf()读取Pandas文件并保存每个 Dataframe ,然后过滤 Dataframe 并将其写入.to_string()文件,这正是我想要的(kind)但是空格的数量不一致。因为它是一个固定宽度的文件,我希望新文件的格式与旧文件完全相同。我也试过用np.savetxt()写,但它也有空格的问题。遗憾的是,Pandas没有write_fwf
所以,也许我可以用普通的Python来代替Pandas来做这件事?或者甚至是一个bash(powershell)脚本?任何有效的东西:)

wvyml7n5

wvyml7n51#

这可能对您有用(GNU sed):

sed -nE ':a;/^a/{h;:b;n;/^\S+ +[^2 ]+ +3 /H;$bc;/^a/{:c;x;/\n/p;x;ba};bb}' file

这是一个过滤操作,因此设置-n并使用-E扩展regexp。
复制当前标题,并循环遍历数据行,将符合条件的行附加到标题。
在文件末尾或下一个标题处,打印上一个标题和任何行。

相关问题