Bash 스크립팅에 도움이 필요합니다. 내 의견은 다음과 같습니다.
Grp: MG1
user1
user2
user3
Grp: MG2
user7
user1
user9
user6
user2
결과는 다음과 같아야 합니다.
Reporting MG1
MG1,user1
MG1,user2
MG1,user3
Reporting MG2
MG2,user7
MG2,user1
MG2,user9
MG2,user6
MG2,user2
시도해 보았지만 sed -n '/cn:/,/cn:/p' file
원하는 효과가 없었습니다.
답변1
이것은 awk
텍스트 서식 지정에 적합한 도구입니다.
awk '/^Grp:/ { OFS=" "; $1= "Reporting"; mg=$2; print; next}
{ OFS=","; print mg, $0}' infile
답변2
사용 sed
:
$ cat script.sed
/^Grp: / { ;# A "Grp: " line
s/// ;# Remove "Grp: "
h ;# Save in hold space
s/^/Reporting /p ;# Insert "Reporting " at start, print
d ;# Delete, start next cycle
}
# Any other line:
G ;# Append the hold space
s/\(.*\)\n\(.*\)/\2,\1/ ;# Swap strings around \n, insert comma
$ sed -f script.sed file
Reporting MG1
MG1,user1
MG1,user2
MG1,user3
Reporting MG2
MG2,user7
MG2,user1
MG2,user9
MG2,user6
MG2,user2
"한 줄"로:
sed -e '/^Grp: /{s///;h;s/^/Reporting /p;d;}' \
-e 'G;s/\(.*\)\n\(.*\)/\2,\1/' file
위와 유사한 접근 방식 awk
:
awk '/^Grp: / { sub("^Grp: ", ""); group = $0; print "Reporting " $0; next }
{ print group "," $0 }' file
이 답변의 및 변형(아래 끝의 변형)은 모두 sed
문자열 내부 또는 외부에서 데이터의 공백을 처리합니다.awk
sh
MG
user
$ cat file
Grp: some group ID
line 1
the other line
$ sed -e '/^Grp: /{s///;h;s/^/Reporting /p;d;}' -e 'G;s/\(.*\)\n\(.*\)/\2,\1/' file
Reporting some group ID
some group ID,line 1
some group ID,the other line
재미있는 운동처럼 다음을 사용하세요 /bin/sh
.
while IFS= read -r line; do
case $line in
'Grp: '*)
group=${line#Grp: }
printf 'Reporting %s\n' "$group"
;;
*)
printf '%s,%s\n' "$group" "$line"
esac
done
다음으로 실행
sh script.sh <file
답변3
위의 입력 예를 고려하면 다음을 사용할 수 있습니다.
#!/bin/bash
group=""
while read line; do
if [[ "${line}" =~ ^Grp:* ]]; then
group="$(echo "${line}" | awk '{ print $2 }')"
echo "Reporting ${group}"
elif [[ "${line}" == "" ]]; then
echo
else
echo "${group},${line}"
fi
done
예를 들어:
$ cat input
Grp: MG1
user1
user2
user3
Grp: MG2
user7
user1
user9
user6
user2
$
$ ./ex.sh < input
Reporting MG1
MG1,user1
MG1,user2
MG1,user3
Reporting MG2
MG2,user7
MG2,user1
MG2,user9
MG2,user6
MG2,user2
$
이 스크립트는 텍스트 줄을 읽는 루프를 실행합니다. 줄이 로 시작하면 Grp:
공백으로 구분된 두 번째 토큰을 로 저장합니다 group
. 줄이 비어 있으면 빈 줄이 인쇄됩니다. 그렇지 않으면 마지막으로 읽은 그룹을 인쇄하고 그 뒤에 쉼표를 붙인 다음 줄의 내용을 인쇄합니다.