[英]AWK: I have 2 input files. Can I made 1 common script to get output in a CSV format by (AWK)?
大家好,
我需要處理2個文件(input_all.txt)或(input_deatils.txt),我想通過一個常見的AWK腳本來處理它們。
我嘗試使用腳本(data.awk)獲取表格式CSV的輸出。
如果我嘗試使用如下所示的代碼
awk -f data.awk input_all.txt > output.txt
or
awk -f data.awk input_details.txt > output.txt
這是我嘗試使用的代碼(data.awk)(我需要幫助來修復此代碼):
BEGIN {
split("Node,Boards,Deactive,DEFAULT,PRIO,GRP,LOAD",array,",");
print_array1(array);
}
/^Node Boards Deactive/ { getline
{ while (/^[a-zA-Z0-9]+/ && (NF>1) == 1)
{ array[1]=(substr($0,1,7))
array[2]=(substr($0,10,7))
array[3]=(substr($0,18,10))
array[4]=(substr($0,34,7))
array[5]=(substr($0,45,9))
array[6]=(substr($0,55,7))
array[6]=(substr($0,64,7))
print_array1(array)
getline }
}
}
function print_array1(array)
{
printf("%-9s", array[1])
printf("%-9s", array[2])
printf("%-12s", array[3])
printf("%-9s", array[4])
printf("%-11s", array[5])
printf("%-9s", array[6])
printf("%-5s", array[7])
printf("\n");
#for(item=2;item<=6;item++){array[item]=""}
}
輸入文件可以是以下格式之一。 第一種格式可以如下所示(input_all.txt)
display:all;
BOARDS STATES IN NODES
Node Boards Deactive DEFAULT PRIO GRP LOAD
TSTS950 S950
2CGBMW1 S854
S857
S852
S855
S853
BM311 BM311 DEACTIVE
BM310 BM310 DEACTIVE
ENA5 PER BD S850 10
S852 22
S854 1
T850 17
T851 59
T852 1
2S50 44
SMDRUH S852 S852
S855 S855
S854 S854
S857 S857
S850
S851
S856
S853
MAINBRD S850 DEFAULT
S851
S856
S853
BM310
S950
T751
S855
T859
S857
T851
END
第二種輸入格式可以是(Input_details.txt)
display:TSTS950 ;
BOARDS STATES IN NODES
Node Boards Deactive DEFAULT PRIO GRP LOAD
TSTS950 S950
END
display:2CGBMW1 ;
BOARDS STATES IN NODES
Node Boards Deactive DEFAULT PRIO GRP LOAD
2CGBMW1 SXSZ
SXSZ
SXSZ
SXSZ
SXSZ
END
display:BM311 ;
BOARDS STATES IN NODES
Node Boards Deactive DEFAULT PRIO GRP LOAD
BM311 BM311 DEACTIVE
END
display:BM310 ;
BOARDS STATES IN NODES
Node Boards Deactive DEFAULT PRIO GRP LOAD
BM310 BM310 DEACTIVE
END
display:S850 ;
BOARDS STATES IN NODES
Node Boards Deactive DEFAULT PRIO GRP LOAD
S850 S850 DEACTIVE
END
display:ENA5 ;
BOARDS STATES IN NODES
Node Boards Deactive DEFAULT PRIO GRP LOAD
ENA5 PER BD S850 10
S852 22
S854 1
T850 17
T851 59
T852 1
2S50 44
END
display:SMDRUH;
BOARDS STATES IN NODES
Node Boards Deactive DEFAULT PRIO GRP LOAD
SMDRUH S852 S852
S855 S855
S854 S854
S857 S857
S850
S851
S856
S853
END
display:MAINBRD ;
BOARDS STATES IN NODES
Node Boards Deactive DEFAULT PRIO GRP LOAD
MAINBRD S850 DEFAULT
S851
S856
S853
BM310
S950
T751
S855
T859
S857
T851
END
所需的輸出應如圖所示(output.txt)。
Node Boards Deactive DEFAULT PRIO GRP LOAD
TSTS950 S950
2CGBMW1 SXSZ
2CGBMW1 SXSZ
2CGBMW1 SXSZ
2CGBMW1 SXSZ
2CGBMW1 SXSZ
BM311 BM311 DEACTIVE
BM310 BM310 DEACTIVE
ENA5 PER BD S850 10
ENA5 PER BD S852 22
ENA5 PER BD S854 1
ENA5 PER BD T850 17
ENA5 PER BD T851 59
ENA5 PER BD T852 1
ENA5 PER BD 2S50 44
SMDRUH S852 S852
SMDRUH S855 S855
SMDRUH S854 S854
SMDRUH S857 S857
SMDRUH S850
SMDRUH S851
SMDRUH S856
SMDRUH S853
MAINBRD S850 DEFAULT
MAINBRD S851 DEFAULT
MAINBRD S856 DEFAULT
MAINBRD S853 DEFAULT
MAINBRD BM310 DEFAULT
MAINBRD S950 DEFAULT
MAINBRD T751 DEFAULT
MAINBRD S855 DEFAULT
MAINBRD T859 DEFAULT
MAINBRD S857 DEFAULT
MAINBRD T851 DEFAULT
現在,代碼(data.awk)無法生成輸出。 有人可以幫我糾正和修改代碼嗎?
我不會為您編寫整個程序,但這也許可以幫助您入門。
據我所知,有趣的數據位於標頭和“塞子”之間,並且您想將報表格式轉換為表格,在表格格式中,不重復前導信息。 也就是說,您要在每個部分的第一行上選擇已聲明的Node,並在每行數據的開頭替換它。 並在附近時抑制空白行。 像這樣:
#! /usr/bin/awk -f
/^Node Boards Deactive/ {
printing = 1
print
next
}
/^END/ {
printing = 0
}
printing == 1 {
printing = 2
Node = $1
print
next
}
printing == 2 {
leader = Node
gsub(/[^ ]/, " ", leader)
gsub("^" leader, Node)
print
}
最后一部分從Node值構造一串空白,並用Node代替。
將其轉換為CSV格式很麻煩,因為awk的正則表達式無法幫助您找到固定偏移量的數據。 我將為此編寫一個單獨的腳本。 如果您使用的是GNU awk,則可能會發現FIELDWIDTHS有幫助。 無論哪種方式,您都必須對列進行計數或使用標題行對其進行計算。 我可能會基於這些偏移量構建一個子字符串數組,並使用OFS =“,”打印該數組。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.