コミュニティ/Netnews 斜め読み

トップ 差分 一覧 Farm ソース 検索 ヘルプ RSS ログイン

comp.lang.awk

  • Netnews の comp.lang.awk を適当に日本語訳して抜粋してあります。(本当に適当です)
  • 書き込んだ人の名前の部分はオリジナルの投稿者の名前に変更させていただきましたが、時間までは変更していません。詳しくは、comp.lang.awk を購読していただくか、Google グループの comp.lang.awk などで確認してください。
  • 件数が増えてきたら古いものから順に過去ログに移動します。過去ログは [complangawk] から参照できます。

最近のタイトル一覧

[ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 ]

comp.lang.awk

お名前
件名
本文

How to let output from one awk program as input to another awk program? - Tom (2006年06月25日 00時56分06秒)

awk のアウトプットを awk のインプットとして利用する方法はありますか?

http://groups.google.co.jp/group/comp.lang.awk/browse_thread/thread/caac588d4542f717/6ffb1eb222acb8d2?hl=ja#6ffb1eb222acb8d2


Re: - Jurgen Kahrs (2006年06月25日 00時56分29秒)

awk -f a.awk mydata.dat | awk -f b.awk > result.dat

のようにします。

{{comment multi|w}}

printing columns containing pattern - Jaroslaw Kaczmarczyk (2006年06月22日 01時16分05秒)

postfix のログファイルは列に異なった数字があります。"delay" というキーワードで解析しようとしています。

delay=1,

のようなものですが、delay を含む列を示すものを awk で記述できますか?

http://groups.google.co.jp/group/comp.lang.awk/browse_thread/thread/5048f0060291b829/4ca60b8160c7be67?hl=ja#4ca60b8160c7be67


Re: - Ed Morton (2006年06月22日 01時17分03秒)

awk '{for (i=1;i<=NF;i++) if ($i ~ /delay) print $i }' file

というようなことを言っていますか?

もしもフィールドセパレーターが異なる場合は -F で指定してください。

{{comment multi|w}}

"Reluctant" Quantifiers? - aaron.davies (2006年06月22日 01時11分52秒)

reluctant 正規表現 quantifiers に対応していますか?

http://groups.google.co.jp/group/comp.lang.awk/browse_thread/thread/ab6867a8744b707f/aa50378e571149fc?hl=ja#aa50378e571149fc


Re: - Ed Morton (2006年06月22日 01時12分09秒)

いいえ、対応していません。

{{comment multi|w}}

How to make up a file name in the awk script? - Tom (2006年06月22日 01時05分53秒)

最初の実行で data_1.dat という名前のファイルに書き出し、次の実行で data_2.dat という名前のファイルに書き出そうと思っています。data_i.dat というファイル名の i を増やしたいのです。

http://groups.google.co.jp/group/comp.lang.awk/browse_thread/thread/24680c3352bcbefe/1e364d21915f6969?hl=ja#1e364d21915f6969


Re: - Cesar Rabak (2006年06月22日 01時06分28秒)

以下のようにしてできます。

BEGIN{ for (i = 1; i < 11; i++){
             print "hello" > ("data_" i ".dat")
       }
}

Re: - Jurgen Kahrs (2006年06月22日 01時07分20秒)

この場合には、ファイルオープン数に気をつけなければいけません。

Re: - Jurgen Kahrs (2006年06月22日 01時08分11秒)

以下のようなものの方がよいでしょう。

for (i=1; i<=10; i++) {
  filename = "data_" i ".dat"
  print "Moin" > filename
  close(filename)
}

{{comment multi|w}}

Extracting a Regex--Multiple Times Per Line? - aaron.davies (2006年06月22日 00時47分23秒)

"fixed text1 @foo@ @bar@ fixed text2 @baz@"

という行から、

@foo@

@bar@

@baz@

と 3 つの分割された行を得たいのです。@ から @ までで囲まれたセパレータを正規表現でどうやるのでしょうか?

http://groups.google.co.jp/group/comp.lang.awk/browse_thread/thread/b3069b875bab6b09/cbd6fe8e1c3ffb20?hl=ja#cbd6fe8e1c3ffb20


Re: - Doug McClure? (2006年06月22日 00時48分03秒)

line = $0
while (match(...)) {
        token = substr(line, RSTART, RLENGTH)
        line = substr(line, RSTART+RLENGTH)
        # Do something with token here
}

のようにします。

Re: - aaron.davies (2006年06月22日 00時49分57秒)

search:
#!/usr/bin/sh

regex=$1
shift

if [ $1 = -f ]; then
        shift
        field_arg="-f $1"
        shift
fi

for file; do
        awk -f /h/scripts/search.awk -- `echo $field_arg` "$regex"
$file
done

というスクリプトと

search.awk:
#!/usr/bin/awk -f

function extract_line(line, regex, field)
{
        while (match(line, regex, pieces))
        {
                token = substr(line, RSTART, RLENGTH)
                line = substr(line, RSTART + RLENGTH)
                print pieces[field]
        }
}

BEGIN {
        field = 0
        for (i = 1; i < ARGC; i++) {
                if (ARGV[i] == "-f")
                {
                        field = ARGV[i + 1]
                        delete ARGV[i]
                        delete ARGV[i + 1]
                }
                else if (ARGV[i] != "")
                {
                        regex = ARGV[i]
                        delete ARGV[i]
                        break
                }
        }
}

match ($0, regex) { extract_line($0, regex, field) }

というスクリプトでやってみています。

Re: - William Park (2006年06月22日 00時50分27秒)

grep -o

でできます。

{{comment multi|w}}

To hex conversion precision - Darek (2006年06月20日 23時52分01秒)

10 進数を 16 進数に変換したいと思っています。

awk '{printf ("%x\n", $0) }' aaaa > bbbb

ただし、値が大きすぎてうまく動作しません。

12491766857 -> 7fffffff
12493627151 -> 7fffffff
12499683119 -> 7fffffff
12503420809 -> 7fffffff
12505828998 -> 7fffffff

http://groups.google.co.jp/group/comp.lang.awk/browse_thread/thread/3b141626cbfb3af5/a5dc0997f9fca080?hl=ja#a5dc0997f9fca080


Re: - Grant (2006年06月20日 23時52分38秒)

$ awk '{printf ("%12d: %x\n", $1,$1) }' zzz

のようにします。

12491766857: 2e8913c49
12493627151: 2e8ad9f0f
12499683119: 2e90a072f
12503420809: 2e9430f89
12505828998: 2e967ce86

Re: - Darek (2006年06月20日 23時53分42秒)

mawk ではうまく動作しません。

darekc@trzeci:~$  awk '{printf ("%12d: %x\n", $1,$1) }' aaaa
(...)
  2147483647: 7fffffff
  2147483647: 7fffffff
  2147483647: 7fffffff
  2147483647: 7fffffff
  2147483647: 7fffffff
  2147483647: 7fffffff
darekc@trzeci:~$ awk -W version
mawk 1.3.3 Nov 1996, Copyright (C) Michael D. Brennan

Re: - Grant (2006年06月22日 00時43分51秒)

以下のようにしてはどうでしょうか。

~$ awk '{printf ("%12d: %x%04x\n", $1, $1/0x10000, and($1,0xffff)) }' zzz
12491766857: 2e8913c49
12493627151: 2e8ad9f0f
12499683119: 2e90a072f
12503420809: 2e9430f89
12505828998: 2e967ce86

best way to evaluate awk result as a shell variable? - RyanD (2006年06月19日 00時23分18秒)

チルダで区切られた以下のようなファイルがあります。

120~12
250~15
499~10

$1 を shell で使いたく、以下のようなことを考えています。

Something like:  first_var=` awk -F~ '{print $1}' myfile.txt`
                          while(i=0;i<endVar;i++)
                                if (first_var='120') then
                                    echo "yipee!"
                                else
                                    echo "nope"
                                 fi

しかし、以下のようになってしまいます。

>echo $first_var
> 120 250 499

知りたいのは shell 変数として $1 を使う際の最も効果的な方法です。

http://groups.google.co.jp/group/comp.lang.awk/browse_thread/thread/d12bfae11691f8b1/92dcc1fecc60e452?hl=ja#92dcc1fecc60e452


Re: - Chris F.A. Johnson (2006年06月19日 00時24分57秒)

awk が最も高速だと思いますが、以下のようにもできます。

while IFS=~ read val1 val2
do
  printf "val1=%s\n" "$val1"
  printf "val2=%s\n" "$val2"
  printf "\n"
done < myfile.txt

Re: - Xicheng Jia (2006年06月19日 00時25分57秒)

awk -F~ '{print ($1==120) ? "yipee" : "nope"}' myfile.txt

のようにすることができます。

Re: - Ed Morton (2006年06月20日 23時49分33秒)

awk -F~ '$1==120{print "yipee!";next}{print "nope"}' myfile.txt

のようにしてみてください。

ただし、今の情報だけで、これ以上やりたいことを推し量るのは難しいです。

{{comment multi|w}}

AWK internal design - denis.mikhalkin (2006年06月19日 00時15分49秒)

awk の素晴らしさを学ぶために、awk の内部デザインの資料とかありますか?

http://groups.google.co.jp/group/comp.lang.awk/browse_thread/thread/21bea0e4172c4099/ab0dfe6a5f64fdf6?hl=ja#ab0dfe6a5f64fdf6


Re: - Jürgen Kahrs (2006年06月19日 00時17分49秒)

Arnold Robbins の以下のものがあります。

以下の 2 つの JAVA を awk に組み込むプロジェクトがあり、ここで awk のドキュメントも見られます。

Re: - dfeustel (2006年06月19日 00時18分52秒)

awk の中で何が最速でしょうか?

Re: - William James (2006年06月19日 00時19分35秒)

フリーでない tawk を除けば、mawk が最速です。

{{comment multi|w}}

Combine consecutive lines with identical keys - kthompso (2006年06月01日 23時58分56秒)

キーでソートされたファイルがあり、キーは $1 と $2 です。

入力ファイルは以下のようなものです。

12345,1,2006-01-01,30,200
12345,1,2006-02-03,29,300
12345,1,2006-03-05,28,150
12345,2,2006-01-04,31,250
12345,2,2006-02-02,28,100
12345,2,2006-03-01,30,300
12345,2,2006-04-01,31,400
78991,2,2006-01-05,31,200
78991,2,2006-02-07,30,450
78891,2,2006-03-08,29,600
78891,2,2006-04-10,31,450
78891,2,2006-05-12,28,200

ここで欲しい出力は以下のようなものですが、どうすればいいでしょうか。

12345,1,2006-01-01,30,200,2006-02-03,29,300,2006-03-05,28,150
12345,2,2006-01-04,31,250,2006-02-02,28,100,2006-03-01,30,300,2006-04-01,31,400
78991,2,2006-01-05,31,200,2006-02-07,30,450,2006-03-08,29,600,2006-04-10,31,450,2006-05-12,28,200

http://groups.google.co.jp/group/comp.lang.awk/browse_thread/thread/f26dc4e39fecfef5/0088fc324597238f?hl=ja#0088fc324597238f


Re: - Harlan Grove (2006年06月01日 23時59分34秒)

BEGIN { FS = "," }
(c = $1 "," $2) == k { s = s substr($0, length(k) + 1); next }
s { print s }
{ k = c; s = $0 }
END { print s }

とすればできます。

{{comment multi|w}}

AWK - hirenshah.05 (2006年06月01日 23時54分37秒)

以下のようなファイルがあります。

PT J
C1 PENN STATE UNIV,DEPT MAT SCI & ENGN,UNIVERSITY PK,PA 16802.
RP KIKUCHI, R, UNIV CALIF LOS ANGELES,DEPT MAT SCI & ENGN,LOS
ANGELES,CA
UT ISI:A1995TD69200001
ER

PT J
RP PANDA, S, UNIV CINCINNATI,DEPT CHEM ENGN,CINCINNATI,OH 45221.
UT ISI:A1995TD69200002
ER

PT J
C1 UNIV CALCUTTA,COLL SCI & TECHNOL,DEPT APPL PHYS,CALCUTTA 700009,W
RP GHATAK, KP, UNIV CALCUTTA,COLL SCI & TECHNOL,DEPT ELECTR SCI,92
 UT ISI:A1995TD69200003
ER

C1 で始まるデータだけを抜き出したいのです。

http://groups.google.co.jp/group/comp.lang.awk/browse_thread/thread/ff329e508f4dc166/47139c74334546bb?hl=ja#47139c74334546bb


Re: - Radoulov, Dimitre (2006年06月01日 23時55分07秒)

grep ^C1 file_name

でできます。

Re: - Cesar Rabak (2006年06月01日 23時55分47秒)

awk '/^C1/' your_text_file

でできます。

{{comment multi|w}}

problem with awk - pilhun (2006年06月01日 23時51分52秒)

以下のように i<1.0 の条件化で echo "hahaha" を実行させないようにしたいのですが、うまくいきません。

awk '{i+=($1*0.00178)}; END {if (i<1.0) exit};END {printf "%1.6e\n",i}' result > n
echo "hahaha"

http://groups.google.co.jp/group/comp.lang.awk/browse_thread/thread/56e44673a934a26d/98d5888e77ef5378?hl=ja#98d5888e77ef5378


Re: - Bob Harris (2006年06月01日 23時52分49秒)

if awk '
    { i += ($1 * 0.00178) }
    END { if (i < 1.0) exit 1
          printf "%1.6e\n", i
        }
'; then
    echo "hahaha"
fi

のようにします。

{{comment multi|w}}

Joining Lines - jefferson.cliff (2006年06月01日 23時46分29秒)

TopBottomLeftRight

というものがあり、最初と 2 番目、3 番目と 4 番目という行にします。

http://groups.google.co.jp/group/comp.lang.awk/browse_thread/thread/8bff985dcc894b03/b69d12568eef8c6e?hl=ja#b69d12568eef8c6e


Re: - Chris F.A. Johnson (2006年06月01日 23時46分50秒)

awk ' NR % 2 { printf "%s", $0; next }
             { print }'

とします。

Re: - jefferson.cliff (2006年06月01日 23時47分40秒)

cat cal1.attr | awk ' NR % 2 { printf "%s", $0; next } {print }'
awk: syntax error near line 1
awk: bailing out near line 1
cat: write error: Broken pipe

となりエラーになります。

Re: - Kenny McCormack? (2006年06月01日 23時49分09秒)

他の回答が必要ですか?

ORS=FNR%2?"":"\n"

Re: - William James (2006年06月01日 23時49分51秒)

gawk '{ORS=ORS?"":"\n"}8' junk

と試してみてください。

{{comment multi|w}}

getline problem - ralmoritz (2006年06月01日 23時40分05秒)

{ # only gets run once?!
    recno = $1;
    origfs = FS;
    FS = " ";
    $0 = $4; # split contract no
    conno = $1; # ...and keep first field
    FS = origfs;
    while ((getline < "a5con.csv") > 0) {
        if (conno == $2) {
            custs[recno] = $6;
            break;
        }
    }
}

END {
    for (i in custs) {
        print i, custs[i];
    }
}

のようにするとメインブロックが 1 回しか実行されません。

http://groups.google.co.jp/group/comp.lang.awk/browse_thread/thread/a2d77942af992374/af155e6de5b79d22?hl=ja#af155e6de5b79d22


Re: - Ted Davis (2006年06月01日 23時41分14秒)

 BEGIN{
 OrigFS = FS
 FS = ","      # if the .csv file is comma delimited, otherwise omit the line
 while( ( getline <  "a5con.csv") > 0) {
   Reference[$2 ] = $6
 }
 close(  "a5con.csv" )
 FS = OrigFS
 }

 {
 split( $4, Scratch, "" )
 if( $1 in Reference )  custs[ Scratch[ 1 ] ] = Reference[ $1 ]
 }

とやってみてください。

Re: - Chris F.A. Johnson (2006年06月01日 23時44分02秒)

One True Awk や nawk では -F '' でうまく動作しませんでした。

$ echo qwertyuyuiopp | otawk -F "" '{print $1; print $2; }'
otawk: field separator FS is empty

qwertyuyuiopp

$ echo qwertyuyuiopp | nawk -F "" '{print $1; print $2; }'
nawk: field separator FS is empty

qwertyuyuiopp

$ echo qwertyuyuiopp | nawk  'BEGIN { FS = "" } {print $1; print $2; }'
q
w
$ echo qwertyuyuiopp | otawk  'BEGIN { FS = "" } {print $1; print $2; }'
q
w

{{comment multi|w}}

Finding unique field values across two files - Jonny (2006年06月01日 23時35分44秒)

各行の $5 が他の $5 と一致しないものを探します。gawk で、

-F\t ARGIND==1{f[$5]=1;next}!f[$5]++{print $0} file2 file1

としてから、

-F\t ARGIND==1{f[$5]=1;next}!f[$5]++{print $0} file1 file2

とします。

もっと効率的にするために 2 つを 1 つにできませんか?

http://groups.google.co.jp/group/comp.lang.awk/browse_thread/thread/0ecee4b658806c2b/3992e907b101d6d1?hl=ja#3992e907b101d6d1


Re: - Harlan Grove (2006年06月01日 23時37分02秒)

file1 と file2 をソートしてから、join と awk を使います。

join -a 1 -a 2 -j 5 -e ' ' -o 1.5,2.5 file1 file2 | awk 'NF<2'

{{comment multi|w}}

remove string from field "beta:23.52" - Otako (2006年05月28日 22時27分55秒)

echo "alpha,  beta:23.52, 21.46" | awk -F, '{print $2}'

の出力は

beta:23.52

ですが、beta: を除くことはできますか?

echo "alpha,  beta:23.52, 21.46" | awk -F, '{print $2}'| cut -d ":" -f 2

とすればできますが、sed, cut を使わずに処理したいのです。

http://groups.google.co.jp/group/comp.lang.awk/browse_thread/thread/ddc6219337f4c7ee/bdc61c2502ed47be?hl=ja#bdc61c2502ed47be


Re: - Grant (2006年05月28日 22時28分39秒)

grant@peetoo:~$ echo "alpha,  beta:23.52, 21.46" | awk -F, '{print $2}'| cut -d ":" -f 2
23.52
grant@peetoo:~$ echo "alpha,  beta:23.52, 21.46" | awk -F, '{split($2,k,":");print k[2]}'
23.52

とすればできます。

Re: - Chris F.A. Johnson (2006年05月28日 22時29分14秒)

echo "alpha,  beta:23.52, 21.46" | awk -F'[,:]' '{print $3}'

とすればできます。

{{comment multi|w}}

How to handle multiple files - nurav (2006年05月28日 22時23分42秒)

2 つのファイルがあり、片方からレコードを読んで、もう片方のファイルに同じものがあれば表示するプログラムはできますか?

http://groups.google.co.jp/group/comp.lang.awk/browse_thread/thread/37825fb135372d65/953e394f067377cd?hl=ja#953e394f067377cd


Re: - Jurgen Kahrs (2006年05月28日 22時25分02秒)

  1. getline で両方のファイルを同時にオープンする
  2. NR と FNR を使って比較する

ググれば見つかります。

{{comment multi|w}}

separator character inside a field - Moritz Bubek (2006年05月28日 22時17分42秒)

数値は , で区切られて、文字列は "文字列" で区切られたファイルがあります。

awk -F ',' '{print NR}' filename

とすると、

1998,"Hello", 546, "cat, dog, mouse", 111, "blabla"

の場合に 6 ではなく、8 で返します。

http://groups.google.co.jp/group/comp.lang.awk/browse_thread/thread/375de2542f069259/0dd064d38ff9ea74?hl=ja#0dd064d38ff9ea74


Re: - Kenny McCormack? (2006年05月28日 22時18分24秒)

csv の問題は今までに何度も記載されてきました。

Re: - Harlan Grove (2006年05月28日 22時19分37秒)

http://groups.google.com/group/comp.lang.awk/msg/1673d9e784c68dee

の setcsv を使ってみてください。

Re: - William Park (2006年05月28日 22時20分45秒)

http://home.eol.ca/~parkw/index.html#dos_line

http://home.eol.ca/~parkw/index.html#parameter_expansion

のように、

   while read -C -a x; do
 declare -p x
   done << EOF
 1998,"Hello", 546, "cat, dog, mouse", 111, "blabla"
   EOF

とすることができます。

Re: - さいとう (2006年05月28日 22時21分42秒)

ちなみに setcsv は以下のようなものです。

function setcsv(str, sep) {
  gsub(/[\\"]"/, "\035", str)
  while (match(str, /"[^"]*"/)) {
      middle = substr(str, RSTART+1, RLENGTH-2)
      gsub(sep,"\036", middle)
      str = substr(str, 1, RSTART-1) middle substr(str, RSTART+RLENGTH)
  }
  if (index(str, "\"")) {
     if ((getline) <= 0)
       return 0
     setcsv(str "\n" $0, sep)
  }
  else {
    gsub("\035", "\"", str)
    gsub(sep, "\034", str)
    gsub("\036", sep, str)
    $0 = str
    return 1
  }

}

{{comment multi|w}}

Subtracting a value from a substring of a record - bay (2006年05月28日 01時26分58秒)

0602161600123,ABC,2,1,426,1,974
0602161600123,DEF,2,1,429,1,972

というインプットがあり、7 から 10 文字目の 1600 に 500 を引いた 1100 を表示して、2, 3, 5 番目のフィールドを表示します。

http://groups.google.co.jp/group/comp.lang.awk/browse_thread/thread/6447ea8b89c6ba45/379ecef58daac0e6?hl=ja#379ecef58daac0e6


Re: - Torfinn.Ottesen (2006年05月28日 01時28分15秒)

$ cat tmp.awk
BEGIN{
  FS=","
}
NF>0{
  gsub(/^......|...$/,"",$1) # keep characters 7 to 10
  $1-=500
  print $1, $2, $3, $5
}

Test run on your data:
$ awk -f tmp.awk tmp.dat
1100 ABC 2 426
1100 DEF 2 429

のようにしてできます。

Re: - Torfinn.Ottesen (2006年05月28日 01時29分03秒)

NF>0 &&  length($1)=13

の方が良いかもしれません。

{{comment multi|w}}

awk parsing records to file - padma.srikanth (2006年05月26日 00時51分04秒)

以下のようなファイルがあります。

#  file: ./D1/30/20.txt
#owner:624
#group:1022
user::rwx
group::---
group:wiss:rwx          # effective: r-x
mask::r-x
other::---

#  file: ./D2/30/1.6
#owner:624
#group:1022
user::rwx
group::---
group:wiss:rwx
mask::rwx
other::---

#  file: ./STonX-0.6.5
#owner:624
#group:1022
user::rwx
group::---
group:wiss:rwx          # effective: --x
mask::--x
other::--x

"# file ..." ではじまり、"other:..." で終わります。これを個々のファイルに書き出すことはできますか?

http://groups.google.co.jp/group/comp.lang.awk/browse_thread/thread/16a6717dbadff300/f99e2aefb33f9bcb?hl=ja#f99e2aefb33f9bcb


Re: - Ed Morton (2006年05月26日 00時51分35秒)

awk -v RS= '{print > "f"++i}' file

とすればできます。

Re: - Pad (2006年05月26日 00時52分11秒)

solaris10.$ awk -v RS= '{ print > "f"++i }' /tmp/dump
awk: syntax error near line 1
awk: bailing out near line 1

Solaris だとエラーになります。

Re: - Chris F.A. Johns (2006年05月26日 00時52分35秒)

awk -v RS="" '{ print > "file_" ++num }'

でできます。

Re: - Pad (2006年05月26日 00時53分03秒)

solaris10.$ awk -v RS="" '{ print > "file_" ++num }'  /tmp/dump
awk: syntax error near line 1
awk: bailing out near line 1

これもエラーになります。

Re: - Chris F.A. Johns (2006年05月26日 00時53分24秒)

nawk を使ってみてください。

Re: - Pad (2006年05月26日 00時54分01秒)

solaris10.$ nawk -v RS="" '{print > "file_"++num}'  /tmp/dump
nawk: syntax error at source line 1
 context is
        {print > >>>  "file_"++ <<<
nawk: illegal statement at source line 1

となってエラーになります。

Re: - Chris F.A. Johns (2006年05月26日 00時54分34秒)

nawk -v RS="" '{
    filename = "file_" ++num
    print > filename }'

これならどうですか?

Re: - Pad (2006年05月26日 00時55分13秒)

solaris10.$ nawk  -v RS=""   '{
  filename = "file_"++num
  print > filename }' /tmp/dump

nawk: file_21 makes too many open files
 input record number 21, file /tmp/dump
 source line number 3

となって、エラーになります。

Re: - Patrick TJ McPhee? (2006年05月26日 00時56分18秒)

nawk -v RS="" '{print > ("file_"++num)}'  /tmp/dump

または

nawk -v RS="" '{fname = "file_" ++num; print > fname; close(fname) }'  /tmp/dump

としてみてください。

Re: - Pad (2006年05月26日 00時56分54秒)

nawk -v RS="" '{fname = "file_" ++num; print > fname; close(fname) }'  /tmp/dump

これで 790 のファイルができました。

Re: - Loki Harfagr (2006年05月28日 22時14分47秒)

$ csplit  --prefix="csplat" --suffix-format="%05d"  MISCFILES/csplit.txt /^$/ {*}

とする方法もあります。

{{comment multi|w}}

Summarize consecutive lines - soto.adolfo (2006年05月25日 01時27分39秒)

FOO123,0,1500,18,0,0,5
FOO123,0,300,0,43,0,7
FOO123,10,0,0,3,0,0
BAR414,0,0,0,13,50,0
BAR414,0,0,0,3,5,0
BAR414,10,0,0,4,0,3
BAR414,22,0,0,10,30,7
BAZ818,9,0,3,65,0,17
BAZ818,18,2,0,21,0,8

といった一連のものがあります。

$1 をキーとして、以下のものを抽出します。

FOO123,10,1800,18,46,0,12
BAR414,32,0,0 30,85,10
BAZ818,27,2,3,86,0,25

キーを 1 つだけとし、$n 全てのフィールドに $2...$n の総和が属するものとします。

http://groups.google.co.jp/group/comp.lang.awk/browse_thread/thread/dded34cf8c461b26/11ce86e0b7b8240a?hl=ja#11ce86e0b7b8240a


Re: - Chris F.A. Johns (2006年05月25日 01時28分54秒)

awk -F, '
     NR > 1 && $1 != last {
          printf "%s,%d,%d,%d,%d,%d\n", last, f2, f3, f4, f5, f6, f7
          f2 = f3 = f4 = f5 = f6 = f7 = 0
       }

       { f2 += $2
         f3 += $3
         f4 += $4
         f5 += $5
         f6 += $6
         f7 += $7
         last = $1
       }

     END {
          printf "%s,%d,%d,%d,%d,%d,%d\n", last, f2, f3, f4, f5, f6, f7
         }'

のようにします。

{{comment multi|w}}

[ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ]


最終更新時間:2007年07月30日 22時13分35秒