#プログラム初心者です。
前提・実現したいこと
awkを使用して、以下のファイルを2つに分割したいと思っています。
cat org.txt
@@@@@@@@@@@@
商品:りんご
産地:青森
補足:値引きあり
出荷状況:済み
@@@@@@@@@@@@
商品:みかん
産地:静岡
出荷状況:未
@@@@@@@@@@@@
商品:ぶどう
産地:山梨
出荷状況:済み
このファイルの“出荷状況”が“済み”と“未”の場合で以下のようにファイルを分割したいのです。
cat syukka.txt
@@@@@@@@@@@@
商品:りんご
産地:青森
補足:値引きあり
出荷状況:済み
@@@@@@@@@@@@
商品:ぶどう
産地:山梨
出荷状況:済み
cat misyukka.txt
@@@@@@@@@@@@
商品:みかん
産地:静岡
出荷状況:未
試したこと
awk初心者なのですが、配列を使うのかと試したのですが、太刀打ちできませんでした・・・
どのようにすればよいかご教授下さい。
以上、宜しくお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答5件
0
ベストアンサー
いわゆる「複行レコード」ですね。レコードセパレータの設定を変更すれば対応できます。
test.awk:
BEGIN{ FS="\n" RS="@@@@@@@@@@@@\n" } /出荷状況:済み/{print RS,$0}
sh
1$ awk -f test.awk org.txt > syukka.txt
投稿2018/11/10 08:17
総合スコア13671
0
こんな漢字で、
bash
1$ cat org.txt|awk '/^@/{if(a)print a;a=$0};!/^@/{a=a"&"$0}END{print a}'|grep '出荷状況:済み'|tr '&' '\n' > syukka.txt 2$ cat org.txt|awk '/^@/{if(a)print a;a=$0};!/^@/{a=a"&"$0}END{print a}'|grep '出荷状況:未'|tr '&' '\n' > misyukka.txt 3 4$ cat syukka.txt 5@@@@@@@@@@@@ 6商品:りんご 7産地:青森 8補足:値引きあり 9出荷状況:済み 10@@@@@@@@@@@@ 11商品:ぶどう 12産地:山梨 13出荷状況:済み 14 15$ cat misyukka.txt 16@@@@@@@@@@@@ 17商品:みかん 18産地:静岡 19出荷状況:未
投稿2018/11/10 07:51
総合スコア5737
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
Bash
1awk ' 2/^@@*/{save=$0;next} 3/^出荷状況:済み/{print save>"syukka.txt";print > "syukka.txt";next} 4/^出荷状況:未/{print save>"misyukka.txt";print > "misyukka.txt";next} 5{save=save "\n" $0} 6' org.txt
投稿2018/11/10 05:34
総合スコア84557
0
KojiDoi さんの回答を元にして書いてみました。
a.awk
awk
1BEGIN { 2 FS="\n" 3 RS="@@@@@@@@@@@@" 4} 5/出荷状況:済み/ {print RS,$0 > "syukka.txt"} 6/出荷状況:未/ {print RS,$0 > "misyukka.txt"}
追記:
org.txt の先頭に
#○○店 #出荷状況について
があった場合、 syukka.txt, misyukka.txt の先頭にもそれを出力するようにしてみました。
(上のコードでは、余分が改行が出力されていたので、 print -> printf に変更して余分な改行がでないよう修正もしています)
awk
1BEGIN { 2 FS="\n" 3 RS="@@@@@@@@@@@@" 4 out_0="misyukka.txt" 5 out_1="syukka.txt" 6} 7 8/#出荷状況について/ {printf $0 > out_0; printf $0 > out_1} 9/出荷状況:未/ {printf "%s%s", RS,$0 > out_0} 10/出荷状況:済み/ {printf "%s%s", RS,$0 > out_1}
投稿2018/11/10 09:25
編集2018/11/10 10:59総合スコア22324
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/11/10 10:08
2018/11/10 10:35
2018/11/10 10:52
2018/11/10 10:59
0
デバッグしてないので、なんかあったらすんません
BEGIN{ s = "" f = 0 } /出荷状況:済み/ { f = 1 } /出荷状況:未/ { f = 2 } /@@@@@@@@@@@@/ && s != "" { if (f == 1) outf = "syukka.txt" if (f == 2) outf = "misyukka.txt" n = split(s, ss) for (i=1; i<=n; i++) { print ss[i] >> outf } s = "" f = 0 } { s = s,$0 } END { if (f == 1) outf = "syukka.txt" if (f == 2) outf = "misyukka.txt" n = split(s, ss) for (i=1; i<=n; i++) { print ss[i] >> outf } }
もし空白を含む行があったら改行がふえます。
--- 追記 ---
head -n 3 src.txt >syukka.txt cp syukka.txt misyukka.txt x=`wc -l src.txt` x=`expr $x - 3` tail -n $x src.txt | awk -f hoge.awk
投稿2018/11/10 06:51
編集2018/11/10 10:59総合スコア7458
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/11/10 08:45
2018/11/10 10:20
2018/11/10 10:53
2018/11/10 10:59
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/11/10 08:48