여러 열 정렬

여러 열 정렬

내 원본 데이터는 -

   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( )를 사용할 수 있습니다. 단락 모드 아래로,행/변수/코프로세스 가져오기pr2열 페이징 명령으로 통신합니다.

  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, grepsed:을 사용하십시오 .

paste -d ' '\
 <(grep -v '"' file)\
 <(grep -v '\.xml' file | sed 's/^[[:blank:]]*//;s/id=.*//')

첫 번째는 grep큰따옴표 없이 모든 줄을 가져옵니다. 이는 ID와 XML 파일 이름이 포함된 빈 줄입니다. 두 번째는 grepXML 파일 이름이 포함되지 않은 모든 줄을 가져옵니다. 선행 공백 문자/탭 문자 및 로 시작하는 문자열이 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

관련 정보