私の元のデータは -
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()を使用できます。 。ショートモードダウン、行/変数/コプロセスのインポート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ファイル名を含む空の行です。 2番目は、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