여러분, 저는 지금까지 이 스크립트를 아무 문제 없이 사용했습니다. 두 개의 파일을 사용하여 네트워크에 연결된 장치에 대한 정보가 포함된 다른 스크립트에서 가져온 .csv를 생성하는데, 이로 인해 파일 모양 오류가 발생합니다.
파일 1.dat:
SN: FCQ1632Y0UQ
Estadio_Admon
ip_address: 148.000.000.123
파일 2.dat:
Device ID: ESTADIO_19
IP address: 148.000.000.119
Interface: FastEthernet0/3
Port ID (outgoing port): GigabitEthernet0
Device ID: ESTADIO_18
IP address: 148.000.000.118
Interface: FastEthernet0/4
Port ID (outgoing port): GigabitEthernet0
Device ID: ESTADIO_16
IP address: 148.000.000.116
Interface: FastEthernet0/6
Port ID (outgoing port): GigabitEthernet0
Device ID: ESTADIO_PALCOS
IP address: 148.000.000.66
Interface: GigabitEthernet0/2
Port ID (outgoing port): GigabitEthernet0/1
SN: FCQ1632Y0US
Device ID: ESTADIO_22
IP address: 148.000.000.122
Interface: FastEthernet0/8
Port ID (outgoing port): GigabitEthernet0
Device ID: SIPCCEF485DE89A
IP address: 148.000.000.92
Interface: FastEthernet0/16
Port ID (outgoing port): Port 1
Device ID: SIPCCEF485DE87B
IP address: 148.000.000.72
Interface: FastEthernet0/13
Port ID (outgoing port): Port 1
Device ID: SIPCCEF485E5719
IP address: 148.000.000.76
Interface: FastEthernet0/17
Port ID (outgoing port): Port 1
Device ID: SIPCCEF485DE894
IP address: 148.000.000.84
Interface: FastEthernet0/14
Port ID (outgoing port): Port 1
Device ID: ESTADIO_TAQUILLAS
IP address: 148.000.000.125
Interface: GigabitEthernet0/1
Port ID (outgoing port): GigabitEthernet1/0/27
SN: FOC1616Y091
스크립트:
awk -v orig=$(awk '$1=="SN:" {print $2}' file1.dat) '
BEGIN {
RS = "\n\n"
FS = "\n"
OFS = ","
print "Device_SN_O,Device_SN_D,Interface,Port_ID"
}
{
for(i=1; i<=NF; i++) {
split($i, a, ": ");
k[a[1]] = a[2]
}
print orig, k["SN"], k["Interface"], k["Port ID (outgoing port)"]
}' file2.dat>final.csv
예상 출력:
Device_SN_O,Device_SN_D,Interface,Port_ID
FCQ1632Y0UQ,,FastEthernet0/3,GigabitEthernet0
FCQ1632Y0UQ,,FastEthernet0/4,GigabitEthernet0
FCQ1632Y0UQ,,FastEthernet0/6,GigabitEthernet0
FCQ1632Y0UQ,FCQ1632Y0US,GigabitEthernet0/2,GigabitEthernet0/1
FCQ1632Y0UQ,,FastEthernet0/8,GigabitEthernet0
FCQ1632Y0UQ,,FastEthernet0/16,Port 1
FCQ1632Y0UQ,,FastEthernet0/13,Port 1
FCQ1632Y0UQ,,FastEthernet0/17,Port 1
FCQ1632Y0UQ,,FastEthernet0/14,Port 1
FCQ1632Y0UQ,FOC1616Y091,GigabitEthernet0/1,GigabitEthernet1/0/27
내가 얻는 결과는 다음과 같습니다.
Device_SN_O,Device_SN_D,Interface,Port_ID
FCQ1632Y0UQ,,FastEthernet0/3,GigabitEthernet0
FCQ1632Y0UQ,,FastEthernet0/4,GigabitEthernet0
FCQ1632Y0UQ,,FastEthernet0/6,GigabitEthernet0
FCQ1632Y0UQ,FCQ1632Y0US,GigabitEthernet0/2,GigabitEthernet0/1
FCQ1632Y0UQ,FCQ1632Y0US,FastEthernet0/8,GigabitEthernet0
FCQ1632Y0UQ,FCQ1632Y0US,FastEthernet0/16,Port 1
FCQ1632Y0UQ,FCQ1632Y0US,FastEthernet0/13,Port 1
FCQ1632Y0UQ,FCQ1632Y0US,FastEthernet0/17,Port 1
FCQ1632Y0UQ,FCQ1632Y0US,FastEthernet0/14,Port 1
FCQ1632Y0UQ,FOC1616Y091,GigabitEthernet0/1,GigabitEthernet1/0/27
보시다시피 Device_SN_D는 다른 스크립트를 찾을 때까지 반복됩니다. 동일한 스크립트를 여러 반복에서 사용했는데 이 오류가 발생한 첫 번째 스크립트입니다.
이 문제를 해결하는 데 도움이 되길 바랍니다.
답변1
데이터에 "SN: ....."이 없으면 k["SN"]에 null 값을 할당하지 않으므로 마지막 값이 그대로 유지됩니다.
다음만 추가하면 됩니다 delete k
(참조https://unix.stackexchange.com/a/147958/27616) 다음 행을 처리하기 직전에 다음 행이 "새로운 k 배열"을 사용하여 처리되도록 합니다.
예를 들어:
awk -v orig=$(awk '$1=="SN:" {print $2}' file1.dat) '
BEGIN {
RS = "\n\n"
FS = "\n"
OFS = ","
print "Device_SN_O,Device_SN_D,Interface,Port_ID"
}
{
for(i=1; i<=NF; i++) {
split($i, a, ": ");
k[a[1]] = a[2]
}
print orig, k["SN"], k["Interface"], k["Port ID (outgoing port)"]
delete k; rem="So that the next line is processed with an emptied k array"
}' file2.dat>final.csv
제공한 데이터를 기반으로 Final.csv에 다음이 제공됩니다.
Device_SN_O,Device_SN_D,Interface,Port_ID
FCQ1632Y0UQ,,FastEthernet0/3,GigabitEthernet0
FCQ1632Y0UQ,,FastEthernet0/4,GigabitEthernet0
FCQ1632Y0UQ,,FastEthernet0/6,GigabitEthernet0
FCQ1632Y0UQ,FCQ1632Y0US,GigabitEthernet0/2,GigabitEthernet0/1
FCQ1632Y0UQ,,FastEthernet0/8,GigabitEthernet0
FCQ1632Y0UQ,,FastEthernet0/16,Port 1
FCQ1632Y0UQ,,FastEthernet0/13,Port 1
FCQ1632Y0UQ,,FastEthernet0/17,Port 1
FCQ1632Y0UQ,,FastEthernet0/14,Port 1
FCQ1632Y0UQ,FOC1616Y091,GigabitEthernet0/1,GigabitEthernet1/0/27
예상대로