複数列の並べ替え

複数列の並べ替え

私の元のデータは -

   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

レコードごとに常に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

pastegrepおよびsed:を使用してください。

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

最初はgrep二重引用符なしですべての行を取得します。これは、IDとXMLファイル名を含む空の行です。 2番目は、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

関連情報