次の行を含むテキストファイルがあるとします。
abcd/efgh/a.jar
{
abcd/efgh/a.class
cdef/ghij/b.class
klmn/opqr/c.class
}
lkmn/opqr/b.zip
{
abcd/efgh/a.class
cdef/ghij/b.class
}
abcd/efgh/a.jar
{
cdef/ghij/b.class
}
最初のケースでは、abcd/efgh/a.jar は中かっこ内に abcd/efgh/a.class、cdef/ghij/b.class、klmn/opqr/c.class があります。 1つのテキストブロックと考えてください。ここで、次のabcd/efgh/a.jarには、中括弧の中にcdef/ghij/b.classがあります。このテキストセクション/ブロックを削除したいです。したがって、最終出力は次のようになります。
abcd/efgh/a.jar
{
abcd/efgh/a.class
cdef/ghij/b.class
klmn/opqr/c.class
}
lkmn/opqr/b.zip
{
abcd/efgh/a.class
cdef/ghij/b.class
}
どんな助けにも感謝します:)
ベストアンサー1
使用
for i in `awk '/}/ {if (NR!=1) print "";next} \
{printf "%s ",$0,"}"}END{print ""}' yt.txt \
|awk '{print $1}'|sort|uniq \
`; \
do \
awk '/}/ {if (NR!=1) print "";next} \
{printf "%s ",$0,"}"}END{printf ""} \
' yt.txt \
|grep "$i"|sed 's/ /\n/g'|grep -v "$i"|sort|uniq \
|awk -v var="$i" ' NR==1 {printf var} {print $0} END {print "}"}' \
;done \
以下の1行の同じコマンド(コピー目的)
for i in `awk '/}/ {if (NR!=1) print "";next} {printf "%s ",$0,"}"}END{print ""}' yt.txt|awk '{print $1}'|sort|uniq` ; do awk '/}/ {if (NR!=1) print "";next} {printf "%s ",$0,"}"}END{printf ""}' yt.txt|grep "$i"|sed 's/ /\n/g'|grep -v "$i"|sort|uniq|awk -v var="$i" ' NR==1 {printf var} {print $0} END {print "}"}' ;done
説明する:
このセクションはブロックの一意のタイトル(、、)をfor
返し、それをブロックに渡します。このセクションには、最初に重複項目を含む各タイトルのすべての行が表示されます。次に、ヘッダーを除いてそのヘッダーブロックの下に残っているすべての行をマージし、最初の行にヘッダーを追加します。そして最後にハードコーディングしました。abcd/efgh/a.jar
lkmn/opqr/b.zip
do
do
grep
}
はい
bash-4.2$ cat yt.txt
abcd/efgh/a.jar
{
abcd/efgh/a.class
cdef/ghij/b.class
klmn/opqr/c.class
}
lkmn/opqr/b.zip
{
abcd/efgh/a.class
cdef/ghij/b.class
}
abcd/efgh/a.jar
{
cdef/ghij/b.class
d.class
}
bash-4.2$ for i in `awk '/}/ {if (NR!=1) print "";next} {printf "%s ",$0,"}"} \
> END{print ""}' yt.txt |awk '{print $1}'|sort|uniq` \
> ; do awk '/}/ {if (NR!=1) print "";next} {printf "%s ",$0,"}"}END{printf ""}' yt.txt \
> |grep "$i"|sed 's/ /\n/g'|grep -v "$i"|sort|uniq \
> |awk -v var="$i" ' NR==1 {printf var} {print $0} END {print "}"}'\
> ;done
abcd/efgh/a.jar
{
abcd/efgh/a.class
cdef/ghij/b.class
d.class
klmn/opqr/c.class
}
lkmn/opqr/b.zip
{
abcd/efgh/a.class
cdef/ghij/b.class
}