2016-04-28 45 views
0

我有成千上萬的文件在UNIX上,我需要分成兩個部分,按照下列規則:的Unix - 巴什 - 如何根據特定的規則文件分割

1)找到的第一次出現字符串「JOB」的文件

2)查找點1發現的發生之後的第一行),其不與逗號結束「」

3)分割點中發現的行後面的文件2)

下面是一個示例文件,這個應該在第e行以字符串'DUMMY'結尾。

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

我該如何做到這一點?

感謝

+1

通過編寫腳本。你有什麼嘗試? – 123

+0

謝謝大家,發現問題,這些文件是從大型機發起的,所以這些行用空格擴展到某一行的長度,很顯然「sed」找不到以「,」結尾的行不起作用。 – eddymax

回答

0

您可以使用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 
[email protected]:~$ cat part2 
//* 
//STEP1 EXEC DB2OPROC 
//... 
$ 
0

我的解決方案是:

  1. find所有被檢查的文件;
  2. grep指定模式的每個文件與-n獲得匹配行,如果匹配;
  3. 將匹配文件拆分爲headtail,並在第二步中獲取行號。

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

0

您可以在幾個使用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

+0

運行Awk只是爲了得到行號碼。這應該重構爲一個單一的Awk腳本。 – tripleee

+0

你是對的,當然你可以重構成一個腳本(例如下面)。然而,如果你不熟悉awk等,那麼多步驟解決方案更容易遵循,而OP大概不是(因此他提出了這個問題)。一個示例單腳本解決方案是:'awk'BEGIN {outf =「part1」}/JOB/{start = 1} {print> outf} start &&/[^,] $/{outf =「part2」}'filename ' – Jerzy