如何使用shell脚本[暂停]跳过文件中匹配字符串(第18-21字符)的所有行

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (21)

输入:

pasdyg:142-2:325:7589:asdrg.                                                      
qyashv:178-2:721:9837:querd.                                                       
Mhjdst:425-6:865:7589:uyder.                                                       
sjuyht:657-2:429:9837:kjthu.                                                          
pasdig:146-2:625:7589:asdrg.                                                        
qyashv:138-2:321:6837:querw.                                                       
rdjdst:419-6:465:7589:uypij.                                                            
sjuyrt:667-2:429:9437:kjthy.     

我有250个文件,每个文件中有近10 MB的数据。所有文件都具有相同的格式,需要在每行的第18-21个字符之间跳过匹配字符串的行。

输出:

pasdyg:142-2:325:7589:asdrg.                                                       
qyashv:178-2:721:9837:querd.                                                       
qyashv:138-2:321:6837:querw.                                                       
sjuyrt:667-2:429:9437:kjthy.                                                            
提问于
用户回答回答于

我想你想在第18-21栏中跳过重复值的行

使用Python

data = '''pasdyg:142-2:325:7589:asdrg.
qyashv:178-2:721:9837:querd.
Mhjdst:425-6:865:7589:uyder.
sjuyht:657-2:429:9837:kjthu.
pasdig:146-2:625:7589:asdrg.
qyashv:138-2:321:6837:querw.
rdjdst:419-6:465:7589:uypij.
sjuyrt:667-2:429:9437:kjthy.'''

unique = set()

for line in data.split('\n'):
    if line[17:21] not in unique:
        unique.add(line[17:21])
        print(line)

#print(unique)        

结果

pasdyg:142-2:325:7589:asdrg.                                                       
qyashv:178-2:721:9837:querd.                                                       
qyashv:138-2:321:6837:querw.                                                       
sjuyrt:667-2:429:9437:kjthy. 

filter.py可以从标准输入获取值的脚本相同

#!/usr/bin/env python3

import sys

unique = set()

for line in sys.stdin:
    if line[17:21] not in unique:
        unique.add(line[17:21])
        sys.stdout.write(line)

#print(unique)    

所以你可以在Linux上使用

cat data.txt | python filter.py

cat data.txt | python filter.py | other_command

要么

cat data.txt | filter.py

cat data.txt | filter.py | other_command

如果你设置它可执行

chmod u+x filter.py

使用sys.argv它可以获得参数,即。filter.py 17 21

扫码关注云+社区

领取腾讯云代金券