我的文件中的数据为
START-OF-FIELDS
ID
NAME
DEPT
END-OF-FIELDS
START-OF-DATA
1|joy|cs
2|sam|ec
END-OF-DATA
START-OF-FIELDS
ID
NAME
DOB
DEPT
ADDRESS
END-OF-FIELDS
START-OF-DATA
5|joe|13/2/2001/|ee|street1
3|gwen|4/08/1999|cs|street2
END-OF-DATA
预期输出:-
ID
NAME
DEPT
数据集 1 的计数为:3
ID
NAME
DOB
DEPT
ADDRESS
数据集 2 的计数为:5,动态编号依此类推。数据集。
我想要计算起始字段和结束字段之间以及起始数据和结束数据之间的数据计数。任何人都可以给我确切的代码来做到这一点。我用过
sed -n '/^START-OF-FIELDS/,/END-OF-FIELDS/{s/^START-OF-FIELDS//;/^END-OF-FIELDS/d;p;}' Sourcefile.txt > START_OF_FIELDS.TXT
wc -l START_OF_FIELDS.TXT
但我没有得到想要的结果。
答案1
鉴于新的更好的问题描述,这实际上更容易
#!/bin/bash
awk 'BEGIN {
SETNR=0;
MODE="Non-Fields"}
(MODE=="Fields") && (! /START-OF-/ ) && (! /END-OF/ ) {
print;
COUNT++
}
/START-OF-FIELDS/ {
COUNT=0;
SETNR++;
MODE="Fields"
}
/END-OF/ {
if (MODE=="Fields") {
printf ("Count for data set %d is: %d\n", SETNR, COUNT)
};
MODE="Non-Fields"
}' $*
答案2
解决方案awk
:
$ awk '/END-OF/{flag=0;printf "Count for data set %d is: %d\n",++i,count;count=0;printf "\n"}
{if(flag){
count++;
print;
}}
/START-OF/{flag=1}' file
ID
NAME
DEPT
Count for data set 1 is: 3
1|joy|cs
2|sam|ec
Count for data set 2 is: 2
ID
NAME
DOB
DEPT
ADDRESS
Count for data set 3 is: 5
5|joe|13/2/2001/|ee|street1
3|gwen|4/08/1999|cs|street2
Count for data set 4 is: 2
答案3
您的问题需要更好地定义,但是查看您的示例输入,我正在猜测您想要做什么。使用如下所示的小 AWK 脚本:
#!/bin/bash
awk '! /START-OF-/ {
if (MODE=="DEFINE") { HEADER=HEADER $0 "|" }
else if ((MODE=="DATA") && (NF>0)) { print }
}
/START-OF-FIELDS/ { MODE="DEFINE"; HEADER="" }
/START-OF-DATA/ {
print HEADER
MODE="DATA"
HEADER=""
}' | sed 's/|$//'
这会产生:
ID|NAME|DEPT
1|joy|cs
2|sam|ec
ID |NAME|DOB|DEPT|ADDRESS
5|joe|13/2/2001/|ee|street1
3|gwen|4/08/1999|cs|street2
注意:我很懒,所以我在标题中的每个字段后面添加了一个竖线。然后我使用 SED 命令删除尾随的 V 形条。
答案4
sed -n '/^START-OF-DATA$/,/^$/{/^START-OF-DATA$/d;/^$/d;p;}' filename
那是:
START-OF-DATA
收集和下一个空行 -之间的行/^START-OF-DATA$/,/^$/
。有了这些行:- 删除分隔符行 -
/^START-OF-DATA$/d
和/^$/d
- 打印其余部分 -
p
- 删除分隔符行 -