3

こんにちは私は以下のエントリを含むcsvファイルを持っています

11
22
13
,,
aa
bb
cc
,,
ww
kk
ll
,,

この列を以下のように同じファイルの3つの列に分割できるLinuxコマンドまたはスクリプトを提案してください

11  aa  ww
22  bb  kk
13  cc  ll
4

5 に答える 5

2

あなたはでそれを行うことができますawk

script.awk次の内容で、という名前のファイルを作成します。

BEGIN {
   line = 0; #Initialize at zero
}
/,,/ { #every time we hit the delimiter
   line = 0; #reset line to zero 
}
!/,,/{ #otherwise
   a[line] = a[line]" "$0; # Add the new input line to the output line
   line++; # increase the counter by one 
}
END {
   for (i in a )
      print a[i] # print the output
}

次のようにファイルを実行します。

awk -f test.awk < datafile 

出力:

$ cat datafile
11
22
13
,,
aa
bb
cc
,,
ww
kk
ll
,,
$ awk -f script.awk < datafile 
 11 aa ww
 22 bb kk
 13 cc ll

または、ワンライナーが必要な場合は、次のようにします。

awk 'BEGIN{line=0;}/,,/{line=0;}!/,,/{a[line++]=a[line]" "$0;}END{for (i in a ) print a[i]}' datafile 

編集:

これにより、フィールド間にコンマが追加されます。

awk 'BEGIN{line=0;}/,,/{line=0;}!/,,/{a[line++]=a[line]?a[line]","$0:$0;}END{for (i in a ) print a[i]}' datafile
                                                              # ^ This is the part that I changed
于 2013-02-05T14:20:08.793 に答える
1

これは、OPが望んでいることを実際に実行する素晴らしいクレイジーシェルパイプラインです:!

#% cat t
11
22
13
,,
aa
bb
cc
,,
ww
kk
ll
,,

それで

#% pr -t -3 -l 4 -s' ' t | sed '$d'
11 aa ww
22 bb kk
13 cc ll

コードに頼らずに、より良いコマンドがあると確信しています。

編集私の解決策を再検討させてくれた私のエラーについてのヘッズアップをしてくれた@user000001に感謝します。

于 2013-02-05T14:24:46.557 に答える
0
perl -lne 'if(/,,/){$.=0}$a{$.}=$a{$.}." ".$_ if($.!=0);END{foreach (sort keys %a){print $a{$_}}}'

以下でテスト済み:

> cat temp
11
22
13
,,
aa
bb
cc
,,
ww
kk
ll
,,
> perl -lne 'if(/,,/){$.=0}$a{$.}=$a{$.}." ".$_ if($.!=0);END{foreach (sort keys %a){print $a{$_}}}' temp
 11 aa ww
 22 bb kk
 13 cc ll
> 
于 2013-02-05T14:31:22.297 に答える
0

これはあなたのために働くかもしれません:

pr -tT3 -s\  file | sed \$d
于 2013-02-05T21:02:16.473 に答える
0

awkで

awk 'BEGIN {RS=",,\n"; FS="[\n]"}{ }{a=a$1" ";b=b$2" ";c=c$3" ";} END{print a"\n"b"\n"c}' temp.txt

出力

11 aa ww
22 bb kk
13 cc ll
于 2013-02-06T02:25:05.623 に答える