Unix - Bash - 如何根据特定规则拆分文件



我在 unix 上有数千个文件,我需要根据以下规则将其分成两部分:

1)在文件中找到字符串"JOB"的第一个出现

2)找到在第1)点中找到的出现之后的第一行,该行不以逗号","结尾

3)在第2点中找到的行之后拆分文件

下面是一个示例文件,这个文件应该在以字符串"DUMMY"结尾的行之后拆分。

//*%OPC SCAN                              
//*%OPC FETCH MEMBER=$BUDGET1,PHASE=SETUP 
// TESTJOB JOB USER=TESTUSER,MSGLEVEL=5,
//                           CLASS=H,PRIORITY=10,
//                           PARAM=DUMMY
//*
//STEP1 EXEC DB2OPROC
//...

我怎样才能做到这一点?

谢谢

您可以使用

sed来完成此任务:

$ cat data1 
//*%OPC SCAN                              
//*%OPC FETCH MEMBER=$BUDGET1,PHASE=SETUP 
// TESTJOB JOB USER=TESTUSER,MSGLEVEL=5,
//                           CLASS=H,PRIORITY=10,
//                           PARAM=DUMMY
//*
//STEP1 EXEC DB2OPROC
//...
$ sed -n '0,/JOB/ p;/JOB/,/[^,]$/ p' data1 | uniq > part1
$ sed '0,/JOB/ d;0,/[^,]$/ d' data1 > part2
$ cat part1 
//*%OPC SCAN                              
//*%OPC FETCH MEMBER=$BUDGET1,PHASE=SETUP 
// TESTJOB JOB USER=TESTUSER,MSGLEVEL=5,
//                           CLASS=H,PRIORITY=10,
//                           PARAM=DUMMY
force@force-virtual-machine:~$ cat part2
//*
//STEP1 EXEC DB2OPROC
//...
$

我的解决方案是:

  1. find所有要检查的文件;
  2. grep每个文件都有指定的模式,-n以获取匹配行(如果匹配);
  3. headtail拆分匹配的文件,行号在第二步中得到。

更重要的是,grep可以处理reg表达式,例如grep -n "^.*JOB.*[^,]$" filename

您可以使用

awk/sed通过几个步骤执行此操作:

line=`awk '/JOB/,/[^,]$/ {x=NR} END {print x}' filename`
next=`expr $line + 1`
sed -ne "1,$line p" filename > part_1
sed -ne "$next,$ p" filename > part_2

其中filename是文件的名称。这将创建两个文件:part_1part_2

最新更新