다음 내용이 포함된 두 개의 입력 파일이 있는 경우: 네트워크 이름을 어떻게 바꾸나요(예: P1MSVmgmtvM이 /rest/ethernet-networks/2bf8bc44-5b31-4e6c-99ed-d68b1e9acf9e로 바뀌었습니다).
파일 1: (입력 파일)
Data_NetworkSet_A
P1MSVmgmtvM
P1MSVvMotion
Data_NetworkSet_B
P2MSVmgmtvM
P2MSVvMotion
Edge_NetworkSet_A
E1MSVEDGEiDMZRUE1
E1MSVEDGEiEXPRUE1
파일 2: (network_name 값 포함)
"name": "P2MSVvMotion",
"uri": "/rest/ethernet-networks/1d3188e4-9c06-4e92-92fd-dde4d6985151",
"name": "P1MSVmgmtvM",
"uri": "/rest/ethernet-networks/2bf8bc44-5b31-4e6c-99ed-d68b1e9acf9e",
"name": "P2MSVmgmtvM",
"uri": "/rest/ethernet-networks/8be8cdd2-e9a6-4ecd-9aa3-435e810c68e9",
"name": "E1MSVEDGEiEXPRUE1",
"uri": "/rest/ethernet-networks/97a47127-5c28-4c5b-891a-5ea3736306d3",
"name": "P1MSVvMotion",
"uri": "/rest/ethernet-networks/c16f119a-b556-464d-96dd-7fee9fd8dbc2",
"name": "E1MSVEDGEiDMZRUE1",
"uri": "/rest/ethernet-networks/cbb509aa-ab8a-4d85-886b-0899424f324c",
예상 출력:
Data_NetworkSet_A
- /rest/ethernet-networks/2bf8bc44-5b31-4e6c-99ed-d68b1e9acf9e
- /rest/ethernet-networks/c16f119a-b556-464d-96dd-7fee9fd8dbc2
Data_NetworkSet_B
- /rest/ethernet-networks/8be8cdd2-e9a6-4ecd-9aa3-435e810c68e9
- /rest/ethernet-networks/1d3188e4-9c06-4e92-92fd-dde4d6985151
Edge_NetworkSet_A
- /rest/ethernet-networks/cbb509aa-ab8a-4d85-886b-0899424f324c
- /rest/ethernet-networks/97a47127-5c28-4c5b-891a-5ea3736306d3
답변1
참조되고 두 줄로 분할되는 필드를 제외하면 이는 상당히 표준적인 조회 작업입니다 awk
.
awk -F: '
function strip(x) {
gsub(/[",]/,"",x)
return x
}
NR==FNR {
i = strip($2)
if (getline > -1) {
a[i] = strip($2)
}
next
}
$1 in a {
$1 = " -"a[$1]
} 1' file2 file1
주다
Data_NetworkSet_A
- /rest/ethernet-networks/2bf8bc44-5b31-4e6c-99ed-d68b1e9acf9e
- /rest/ethernet-networks/c16f119a-b556-464d-96dd-7fee9fd8dbc2
Data_NetworkSet_B
- /rest/ethernet-networks/8be8cdd2-e9a6-4ecd-9aa3-435e810c68e9
- /rest/ethernet-networks/1d3188e4-9c06-4e92-92fd-dde4d6985151
Edge_NetworkSet_A
- /rest/ethernet-networks/cbb509aa-ab8a-4d85-886b-0899424f324c
- /rest/ethernet-networks/97a47127-5c28-4c5b-891a-5ea3736306d3
답변2
이름이 변수 참조가 되도록 파일 1을 변환합니다.
awk '$0 !~ /^ / { print; next; }; { sub("^ *","&$"); print; }' file1 Data_NetworkSet_A $P1MSVmgmtvM $P1MSVvMotion ...
파일 2의 데이터를 쉘 변수로 읽습니다(
PATH
"위험한" 이름(예: )이 없다고 가정).while read dummy varname; read dummy varvalue; do eval "export ${varname%,}=${varvalue%,}" done <file2
envsubst
이름을 값으로 바꾸었습니다 .envsubst <file2 Data_NetworkSet_A /rest/ethernet-networks/2bf8bc44-5b31-4e6c-99ed-d68b1e9acf9e /rest/ethernet-networks/c16f119a-b556-464d-96dd-7fee9fd8dbc2
답변3
또 다른 솔루션(올인원):
IFS='' #prevent ending/trailing whitespace from being trimmed.
while read line in
do
if [ ! "$(echo $line | grep -e'^\s')" ] # if the word is not begins from space
then
# just write it to result_file
echo $line >> result_file
else
# cut leading space => grep in file_2 (get 1 line after match too) => grep for uri => cut no needed symbols => write it to result_file
echo " - $(grep -A1 $(echo "$line" | tr -d ' ') file_2 | grep uri | cut -d ':' -f2 | tr -d '", ')" >> result_file
fi
done < file_1
스크립트는 행을 읽고 file_1
와 비교합니다 file_2
. 결과가 푸시되었습니다 result_file
.