根据匹配模式将文件内容提取到多个文件中

根据匹配模式将文件内容提取到多个文件中

我是 unix 新手。我想处理这个文件。

PP_NAME_1
jprovider|J Driver Provider|${J_DRIVER_PATH}/jcc;${J_DRIVER_PATH}/jcc_license_cu|${J_DRIVER_NATIVEPATH}|com.jcc.Connection
source|BDBDDS|dbc/chuchchu|JDriver Provider|node/chuchchu_ias|chuchchu|password|CHCHCH|4|serverName|portNumber
save
PP_NAME_2
classPath|/mm/ja/lib
customProperty|AppContent.Directory|-8
customProperty|javx.toreType|-8
customProperty|javax.tore|-8
save
PP_NAME_3
classPath|/mm/ja/lib
customProperty|AppContent.Directory|-8
customProperty|javx.toreType|-8
customProperty|javax.tore|-8
Alias|461bdhk_host|123.45.67.89|10000
source|BDBDDS|dbc/chuchchu|JDriver Provider|node/chuchchu_s|chuchchu|password|CHCHCH|4|serverName|portNumber
Variable|J_DRIVER_PATH|
save
PP_NAME_4
classPath|/mm/ja/lib
Variable|J_DRIVER_PATH|
save

我想提取匹配模式 PP_NAME_1 旁边的行,首先将模式保存到 FILE1 中

然后将匹配模式 PP_NAME_2 的下一行与第二个保存模式一起保存到 FILE2 中,依此类推。

原始文件中不会有空行。

您将观察到每个文件的行数有所不同。

FILE1 将有 3 行

FILE2 将有 5 行

FILE3 将有 8 行

FILE4 将有 3 行。

所以,每次的线路都会有所不同,可能会有超过 50 条线路。

答案1

使用awkwithPP_NAME_作为记录分隔符:

awk -v RS='PP_NAME_' -v FS='\n' '/./ {print | "tail -n +2 >FILE"$1}' input

awk每次读入一条“记录”,并将每条记录划分为“字段”。在这种情况下,用户RS='PP_NAME_'将记录定义为直到字符 的下一个实例为止的所有文本PP_NAME_。字段分隔符FS等于一个新行。这意味着每行都是一个“字段”。按照这种方式定义,每条记录都以一行开头,其中包含我们要将记录写入的文件的编号。将记录实际写入文件的操作如下:print | "tail -n +2 >FILE"$1。由于$1是第一行上剩余的编号,"FILE"$1是我们要写入的输出文件的名称。我们希望将记录中的所有内容写入该文件除了第一个有数字的行。使用 shell 命令tail -n +2可以删除第一行。

读入的第一条记录是第一次出现 之前的所有文本PP_NAME_。这意味着读入的第一条记录是空的。由于我们不想写出它,因此将正则表达式/./放在print命令之前。此正则表达式匹配任何非空记录。这意味着它消除了我们不想要的空记录。

相关内容