2016-04-28 10 views
0

私は、次の規則に従って、二つの部分に分割する必要があることを、UNIX上のファイルの数千人を持っている:のUnix - バッシュ - 特定の規則に従ってファイルを分割する方法

1)の最初の発生を検索文字列をカンマで終わらないファイル

2)ポイント1で見つかっ出現後の最初の行を検索します)の「JOB」「」

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. 一致するファイルをheadまたはtailで分割し、2行目の行番号を取得します。

さらに、grepはreg式を処理できます。例えば、grep -n "^.*JOB.*[^,]$" filename

0

あなたはawk/sedを使用してこの手順のカップルでこれを行うことができます。

filenameは、あなたのファイルの名前です
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 

。これにより、2つのファイルが作成されます:part_1part_2

+0

行番号を取得するためだけにAwkを実行すると、stillyです。これは、1つのAwkスクリプトにリファクタリングする必要があります。 – tripleee

+0

あなたは正しいですが、もちろんリファクタリングして1つのスクリプトにすることもできます(例:下記)。しかし、あなたがawkなどに精通していなければ、複数のステップの解決策が簡単になります.OPはおそらくそうではありません(したがって彼は質問しています)。シングルスクリプトソリューションの例は次のとおりです:awk BEGIN {outf = "part1"}/JOB/{start = 1} {print> outf} start &&/[^、] $/{outf = "part2"} 'filename ' – Jerzy

関連する問題