shell - AWK 拆分多个分隔线

标签 shell unix awk split

我正在尝试使用 AWK 单行拆分文件,但我附带的以下代码无法正常工作。

awk '
BEGIN { idx=0; file="original_file.split." }
/^REC_DELIMITER.(HIGH|TOP)$/ { idx++ }
/^REC_DELIMITER.TOP$/,/^REC_DELIMITER.(HIGH|TOP)$/ { print > file sprintf("%03d", idx) }
' original_file

测试文件是“original_file”:

REC_DELIMITER.TOP
lineA1
lineA2
lineA3
REC_DELIMITER.HIGH
lineB1
lineB2
lineB3
REC_DELIMITER.TOP
lineC1
lineC2
lineC3
REC_DELIMITER.HIGH
lineD1
lineD2
lineD3

上面的 AWK 代码用于 REC_DELIMITER.TOP,它给了我这些文件:

original_file.split.001:
REC_DELIMITER.TOP

original_file.split.003:
REC_DELIMITER.TOP

但是,我正在努力做到这一点:

original_file.split.001:
REC_DELIMITER.TOP
lineA1
lineA2
lineA3

original_file.split.003:
REC_DELIMITER.TOP
lineC1
lineC2
lineC3

还会有其他的记录分隔符,需要的时候,我们可以像REC_DELIMITER.HIGH一样为它们运行,这样得到的文件如下:

original_file.split.002:
REC_DELIMITER.HIGH
lineB1
lineB2
lineB3

original_file.split.004:
REC_DELIMITER.HIGH
lineD1
lineD2
lineD3

任何帮助都非常感谢,过去几天我一直在努力让这个工作,上面的 AWK 代码是我能得到的最好的。我现在需要 AWK 大师的帮助。 :)

谢谢!

最佳答案

你可以试试这样的:

awk '
/REC_DELIMITER\.TOP/ {
    a=1
    b=0
    file = sprintf (FILENAME".split.%03d",++n)
}    
/REC_DELIMITER\.HIGH/ {
    b=1
    a=0
    file = sprintf (FILENAME".split.%03d",++n)
}  
a {
    print $0 > file
}    
b {
    print $0 > file
}' file

关于shell - AWK 拆分多个分隔线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17052428/

相关文章:

linux - Bash 脚本 FS 使用

linux - 如何为我的linux系统下的每个人设置环境变量?

awk - 如何将每隔一行的最后一列附加到后续行的最后一列

linux - 需要在来自远程 ssh 的文件末尾的特定行插入一个单词

unix - 谁能告诉我 unix shell 测试条件中的 -a 是什么意思?

python - 如何从一个大文件中随机删除多行?

json - 使用 jq 从每个主要节点版本获取最新版本

C 适当使用全局变量

linux - 我们可以在 bash shell 中进行动态替换吗?

java - 最终的 Processbuilder 命令是什么样的?