내 원본 데이터는 -
id=ABC name=Banana DB Connection type=FruitMarket
XYZ_1 ABC.xml
XYZ_2 ABC.xml
XYZ_3 ABC.xml
"Fruits/Mango/#Common"
"Fruits/Mango/#Bizzare"
"Fruits/Mango/#Common"
id=EFG name=FruitHouse type=jms
XYZ_4 EFG.xml
"Fruits/Plum Orange"
id=JKL name=JMSWriteConnect type=jms
XYZ_4 JKL.xml
"Fruits/Plum Orange"
id=TMZ name=Banana DB Connection type=FruitMarket
XYZ_5 TMZ.xml
"Fruits/Mango/Backup/Apple"
id=LDL name=Banana DB Market-Connect type=FruitMarket
XYZ_6 LDL.xml
XYZ_7 LDL.xml
XYZ_8 LDL.xml
XYZ_9 LDL.xml
XYZ_10 LDL.xml
XYZ_11 LDL.xml
"Fruits/Mango/#Common"
"Fruits/Mango/#Common"
"VEG/Mango/#NOT"
"Fruits/Mango/#Common"
"Fruits/Mango/#NOT"
"Fruits/Mango/#Common"
쉘 스크립트(awk, sed, bash)를 사용하여 (최종 출력)으로 정렬하고 싶습니다.
id=ABC name=Banana DB Connection type=FruitMarket
XYZ_1 ABC.xml "Fruits/Mango/#Common"
XYZ_2 ABC.xml "Fruits/Mango/#Bizzare"
XYZ_3 ABC.xml "Fruits/Mango/#Common"
id=EFG name=FruitHouse type=jms
XYZ_4 EFG.xml "Fruits/Plum Orange"
id=JKL name=JMSWriteConnect type=jms
XYZ_4 JKL.xml "Fruits/Plum Orange"
id=TMZ name=Banana DB Connection type=FruitMarket
XYZ_5 TMZ.xml "Fruits/Mango/Backup/Apple"
id=LDL name=Banana DB Market-Connect type=FruitMarket
XYZ_6 LDL.xml "Fruits/Mango/#Common"
XYZ_7 LDL.xml "Fruits/Mango/#Common"
XYZ_8 LDL.xml "VEG/Mango/#NOT"
XYZ_9 LDL.xml "Fruits/Mango/#Common"
XYZ_10 LDL.xml "Fruits/Mango/#NOT"
XYZ_11 LDL.xml "Fruits/Mango/#Common"
줄 안의 공백은 중요하지 않습니다. 어떤 단서도 도움이 될 것입니다.
답변1
레코드당 항상 하나의 헤더 행(id/name/type)만 있고 레코드 본문은 동일한 수의 XYZ_n LDL.xml 행과 카테고리(과일/야채) 행으로 구성된다고 가정하면 다음 gawk
에서 GNU awk( )를 사용할 수 있습니다. 단락 모드 아래로,행/변수/코프로세스 가져오기pr
2열 페이징 명령으로 통신합니다.
BEGIN {
RS = ""; FS = "\n";
cmd = "pr -T -s -2"
}
{
print $1;
for(i=2;i<=NF;i++)
print $i |& cmd;
close(cmd,"to");
while((cmd |& getline line) > 0)
print line;
close(cmd);
print ""
}
' file
id=ABC name=Banana DB Connection type=FruitMarket
XYZ_1 ABC.xml "Fruits/Mango/#Common"
XYZ_2 ABC.xml "Fruits/Mango/#Bizzare"
XYZ_3 ABC.xml "Fruits/Mango/#Common"
id=EFG name=FruitHouse type=jms
XYZ_4 EFG.xml "Fruits/Plum Orange"
id=JKL name=JMSWriteConnect type=jms
XYZ_4 JKL.xml "Fruits/Plum Orange"
id=TMZ name=Banana DB Connection type=FruitMarket
XYZ_5 TMZ.xml "Fruits/Mango/Backup/Apple"
id=LDL name=Banana DB Market-Connect type=FruitMarket
XYZ_6 LDL.xml "Fruits/Mango/#Common"
XYZ_7 LDL.xml "Fruits/Mango/#Common"
XYZ_8 LDL.xml "VEG/Mango/#NOT"
XYZ_9 LDL.xml "Fruits/Mango/#Common"
XYZ_10 LDL.xml "Fruits/Mango/#NOT"
XYZ_11 LDL.xml "Fruits/Mango/#Common"
답변2
진주:
perl -00 -F'\n' -anE '
$n = ($#F + 1)/2;
say $F[0];
say $F[$_], $F[$_+$n] for (1..$n);
say "";
' raw
-00
단락별로 파일 분할-F'\n'
필드 구분 기호로 개행 문자 사용-a
@F 배열에 저장된 필드로 레코드를 "자동 분할"합니다.-n
파일의 레코드를 반복합니다.
id=ABC name=Banana DB Connection type=FruitMarket
XYZ_1 ABC.xml "Fruits/Mango/#Common"
XYZ_2 ABC.xml "Fruits/Mango/#Bizzare"
XYZ_3 ABC.xml "Fruits/Mango/#Common"
id=EFG name=FruitHouse type=jms
XYZ_4 EFG.xml "Fruits/Plum Orange"
id=JKL name=JMSWriteConnect type=jms
XYZ_4 JKL.xml "Fruits/Plum Orange"
id=TMZ name=Banana DB Connection type=FruitMarket
XYZ_5 TMZ.xml "Fruits/Mango/Backup/Apple"
id=LDL name=Banana DB Market-Connect type=FruitMarket
XYZ_6 LDL.xml "Fruits/Mango/#Common"
XYZ_7 LDL.xml "Fruits/Mango/#Common"
XYZ_8 LDL.xml "VEG/Mango/#NOT"
XYZ_9 LDL.xml "Fruits/Mango/#Common"
XYZ_10 LDL.xml "Fruits/Mango/#NOT"
XYZ_11 LDL.xml "Fruits/Mango/#Common"
답변3
paste
, grep
및 sed
:을 사용하십시오 .
paste -d ' '\
<(grep -v '"' file)\
<(grep -v '\.xml' file | sed 's/^[[:blank:]]*//;s/id=.*//')
첫 번째는 grep
큰따옴표 없이 모든 줄을 가져옵니다. 이는 ID와 XML 파일 이름이 포함된 빈 줄입니다. 두 번째는 grep
XML 파일 이름이 포함되지 않은 모든 줄을 가져옵니다. 선행 공백 문자/탭 문자 및 로 시작하는 문자열이 id=
제거됩니다. paste
두 결과를 결합하려면 공백 문자를 구분 기호로 사용하세요.
답변4
버전awk
awk -v RS="" -v FS="\n" '{print $1; for (i=2; i<=((NF+1)/2); i+=1)
{print $i, $((NF+1)/2+i-1)}; print "\n"}' file