我使用的是awk (不支持GAWK)。
我在分析一个文件。(我无法格式化问题中的输入和输出,如果有人可以格式化,请支持)
输入文件如下所示:-
Selc PR Seq Salary Level Rate
2 1x 3x 360020 EXPERT
1 2 962010 EXPERT
1 5 269050 EXPERT
1 6 269060 EXPERT
68 1 1 360020 EXPERT
1 2 962010 EXPERT
1 6 269060 EXPERT
2 7 7 360020 EXPERT
962 1 2 169820 BEGINNER 146
1 3 267170 BEGINNER 146
1 1 169810 EXPERT 148
1005 1 1 360020 EXPERT
1 2 962010 EXPERT
1 3 962010 EXPERT
END守则如下:
BEGIN {
Salarylit("Selc,PR,Seq,Salary,Level,Rate",array,",");
print_array(array)
}
/^Selc PR Seq Salary Level Rate/ {
getline
array[1]=trim_blank(substr($0,1,5)) #Selc
array[2]=trim_blank(substr($0,8,4)) #PR
array[3]=trim_blank(substr($0,14,4)) #Seq
array[4]=trim_blank(substr($0,20,7)) #Salary
array[5]=trim_blank(substr($0,29,6)) #Level
array[6]=trim_blank(substr($0,37,4)) #Rate
getline
}
/^ / {if(NF!=0)
{
print_array(array)
array[2]=trim_blank(substr($0,8,4)) #SalaryID
array[3]=trim_blank(substr($0,14,4)) #Seq
array[4]=trim_blank(substr($0,20,7)) #Salary
array[5]=trim_blank(substr($0,29,6)) #Level
array[6]=trim_blank(substr($0,37,4)) #Rate
}
}
function print_array(array)
{
printf("%-6s", array[1])
printf("%-5s", array[2])
printf("%-5s", array[3])
printf("%-8s", array[4])
printf("%-7s", array[5])
printf("%-5s", array[6])
printf("\n");
}
function trim_blank(str){
#trim will remove the SalaryACE & TAB at begining or end of str
blk=" "
tab="\t"
while(1){
if((substr(str,1,1)==blk)||(substr(str,1,1)==tab)) {str=substr(str,2,(length(str)-1))}
else if((substr(str,length(str),1)==blk)||(substr(str,length(str),1)==tab)) {str=substr(str,1,(length(str)-1))}
else {return str}
}
}输出应如下:-
Selc PR Seq Salary Level Rate
2 1x 3x 360020 EXPERT
2 1 2 962010 EXPERT
2 1 5 269050 EXPERT
2 1 6 269060 EXPERT
68 1 1 360020 EXPERT
68 1 2 962010 EXPERT
68 1 6 269060 EXPERT
2 7 7 360020 EXPERT
962 1 2 169820 BEGINNER 146
962 1 3 267170 BEGINNER 146
962 1 1 169810 EXPERT 148
1005 1 1 360020 EXPERT
1005 1 2 962010 EXPERT
1005 1 3 962010 EXPERT发布于 2021-03-15 21:11:51
我不确定,但我想这就是你想做的:
$ cat tst.awk
BEGIN { OFS="" }
NR==1 {
sub(/[[:space:]]+$/,"")
hdr = $0
while ( match(hdr,/[[:space:]]*[^[:space:]]+[[:space:]]+/) ) {
wids[++nf] = RLENGTH
hdr = substr(hdr,1+RLENGTH)
}
nf++
}
{
delete vals
for (i=1; i<nf; i++) {
vals[i] = substr($0,1,wids[i])
$0 = substr($0,1+wids[i])
}
vals[nf] = $0
for (i=1; i<=nf; i++) {
val = ( (i==1) && (vals[i]~/^[[:space:]]*$/) ? prev[i] : vals[i] )
gsub(/^[[:space:]]+|[[:space:]]+$/,"",val)
wid = ( i < nf ? wids[i] : length(val) )
printf "%-*s%s", wid, val, (i<nf ? OFS : ORS)
prev[i] = val
}
}$ awk -f tst.awk file
Selc PR Seq Salary Level Rate
2 1x 3x 360020 EXPERT
2 1 2 962010 EXPERT
2 1 5 269050 EXPERT
2 1 6 269060 EXPERT
68 1 1 360020 EXPERT
68 1 2 962010 EXPERT
68 1 6 269060 EXPERT
2 7 7 360020 EXPERT
962 1 2 169820 BEGINNER 146
962 1 3 267170 BEGINNER 146
962 1 1 169810 EXPERT 148
1005 1 1 360020 EXPERT
1005 1 2 962010 EXPERT
1005 1 3 962010 EXPERThttps://stackoverflow.com/questions/66641881
复制相似问题