我正在尝试使用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大师的帮助。 :)
谢谢!
答案 0 :(得分:5)
您可以尝试这样的事情:
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
答案 1 :(得分:3)
你需要这样的东西(未经测试):
awk -v dtype="TOP" '
BEGIN { dbase = "^REC_DELIMITER\\."; delim = dbase dtype "$" }
$0 ~ dbase { inBlock=0 }
$0 ~ delim { inBlock=1; idx++ }
inBlock { print > sprintf("original_file.split.%03d", idx) }
' original_file
答案 2 :(得分:2)
awk -vRS=REC_DELIMITER '/^.TOP\n/{print RS $0 > sprintf("original_file.split.%03d",n)};!++n' original_file
(最后给予或采取额外的换行。)
通常,当输入被视为一系列带有特殊行作为分隔符的多行记录时,最直接的方法是将RS(通常是ORS)设置为该分隔符。
通常你想要在其开头和/或结尾添加换行符,但这种情况有点特殊,所以没有它们会更容易。
编辑添加:你需要GNU Awk。标准Awk仅考虑RS的第一个字符。
答案 3 :(得分:1)
我进行了一些更改,因此不同的分隔符会转到自己的文件,即使它们稍后出现在文件中也是如此。使用下面的内容创建一个像splitter.awk这样的文件,chmod + x然后用./splitter.awk original_file
#!/usr/bin/awk -f
BEGIN {
idx=0;
file="original_file.split.";
out=""
}
{
if($0 ~ /^REC_DELIMITER.(TOP|HIGH)/){
if (!cnt[$0]) {
cnt[$0] = ++idx;
}
out=cnt[$0];
}
print > file sprintf("%03d", out)
}
答案 4 :(得分:-2)
我不太习惯AWK,然而,plasticide的回答让我朝着正确的方向前进,我最终得到了AWK脚本作为要求。
在下面的代码中,如果找到demilier,则首先将IF转为0。如果找到所需的分隔符,则第二个IF将echo转为1,然后将所需的分隔符从文件中分割出来。
我知道正则表达式可能类似于/^(REC_(DELIMITER\.(TOP|HIGH|LOW)|NO_CATEGORY)$/
,但由于正则表达式是通过从特定文件中读取分隔符列表的shellcript动态创建的,因此它看起来更像是在下面的AWK中。
awk 'BEGIN {
idx=0; echo=1; file="original_file.split."
}
{
#All the delimiters to consider in given file
if($0 ~ /^(REC_DELIMITER.TOP|REC_DELIMITER.HIGH|REC_DELIMITER.LOW|REC_NO_CATEGORY)$/) {
echo=0
}
#Delimiters that should actually be pulled
if($0 ~ /^(REC_DELIMITER.HIGH|REC_DELIMITER.LOW)$/ {
idx++; echo=1
}
#Print to a file is match wanted delimmiter
if(echo) {
print > file idx
}
}' original_file
谢谢大家。我非常感激。