1

繰り返しますが、ヘッダーのない次のデータを含む約150個のファイルがあります

x1 y1 z1

x2 y2 z2

...

ズンインズン

区切り文字はたまたまタブキーです。これらの 150 個のファイルに対して sed およびバッチ処理を使用して、次の出力を得るにはどうすればよいでしょうか。

x1

x2

x3

...

xn

y1

y2

y3

...

えん

z1

z2

z3

..

ズン

どんなアイデアでも大歓迎です。

注:重複ではなく、以前に同様の質問を投稿しました。こちらのリンクをご覧ください。

よろしく、

イケル

4

2 に答える 2

1

sedこの仕事に最適なツールだとは思いません。頭に浮かぶ最も簡単な解決策は、単純にcut3 回使用することです。

cut -f1 file && cut -f2 file && cut -f3 file

の内容file:

x1  y1  z1
x2  y2  z2
x3  y3  z3
xn  yn  zn

結果:

x1
x2
x3
xn
y1
y2
y3
yn
z1
z2
z3
zn

ファイルをバッチ処理するには、現在の作業ディレクトリに目的のファイルのみがあると仮定します。

for i in *; do 
    cut -f1 "$i" >> "$i.bak"
    cut -f2 "$i" >> "$i.bak"
    cut -f3 "$i" >> "$i.bak"

    mv "$i.bak" "$i"
done
于 2013-01-28T06:36:53.933 に答える
1

あなたがperlにアレルギーがないことを願っています...

このソリューションは、任意の数の列を持つファイルに対して機能します。

$ perl -ne 'BEGIN { @a = (); } $i = 0; foreach (split(/\s+/)) { $l = ($a[$i++] ||= []); push @$l, $_; }; END { print join("\n", @$_) . "\n" foreach (@a); }' << EOF
> x1 y1 z1
> x2 y2 z2
> x3 y3 z3
> x4 y4 z4
> EOF
x1
x2
x3
x4
y1
y2
y3
y4
z1
z2
z3
z4

これは本当に明白ではないので、コメントします。

  • perl -n行ごとに読み取り (正確には、読み取りと に対する分割$/)、-eスクリプトレットを実行します。
  • BEGINブロックは最初の入力が読み取られる前に実行され、ブロックENDは最後に実行されます。

解剖学:

BEGIN { @a = (); }         # Creates an array named "a"
# Main scriptlet
$i = 0;
foreach (split(/\s+/)) {   # Split an input line against one or more space chars
    $l =                   # Set $l to...
        ($a[$i++] ||= []); # what is at index i of @a (increment i), but if not set,
                           # set to an (empty) array ref and return that
    push @$l, $_;          # Push token to the end of the array ref
}
END {                      # End block...
    print join("\n", @$_)  # Print the contents of array references, joined with \n,
    . "\n"                 # then \n,
    foreach (@a);          # for each element of array a
}                          # DONE
于 2013-01-28T06:35:19.823 に答える