我在 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
//...
$
我的解决方案是:
-
find
所有要检查的文件; -
grep
每个文件都有指定的模式,-n
以获取匹配行(如果匹配);
按 head
或tail
拆分匹配的文件,行号在第二步中得到。
更重要的是,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_1
和 part_2
。