3

このような100000行を含むファイルがあります

1 0110100010010101
2 1000010010111001
3 1000011001111000
10 1011110000111110
123 0001000000100001

文字間に空白を追加して、2番目のフィールドだけを効率的に表示するにはどうすればよいか知りたいです。

0 1 1 0 1 0 0 0 1 0 0 1 0 1 0 1
1 0 0 0 0 1 0 0 1 0 1 1 1 0 0 1
1 0 0 0 0 1 1 0 0 1 1 1 1 0 0 0
1 0 1 1 1 1 0 0 0 0 1 1 1 1 1 0
0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 1

1つの解決策は、awkで2番目の列を取得し、sedを使用して空白を追加することです。ただし、ファイルが長すぎるため、パイプの使用は避けたいと思います。それなら、awkを使うだけでそれができるのだろうかと思います。

前もって感謝します

4

5 に答える 5

4

これでいい?

awk '{gsub(/./,"& ",$2);print $2}' yourFile

kent$  echo "1 0110100010010101
2 1000010010111001
3 1000011001111000"|awk '{gsub(/./,"& ",$2);print $2}'
0 1 1 0 1 0 0 0 1 0 0 1 0 1 0 1 
1 0 0 0 0 1 0 0 1 0 1 1 1 0 0 1 
1 0 0 0 0 1 1 0 0 1 1 1 1 0 0 0

アップデート

1列目の2桁以上は機能しませんか?聞き取れませんでした:

kent$  echo "133 0110100010010101
233 1000010010111001
333 1000011001111000"|awk '{gsub(/./,"& ",$2);print $2}'
0 1 1 0 1 0 0 0 1 0 0 1 0 1 0 1 
1 0 0 0 0 1 0 0 1 0 1 1 1 0 0 1 
1 0 0 0 0 1 1 0 0 1 1 1 1 0 0 0 


gsub(/./,"& ", $2)

1 /./  match any single character
2 "& " & here means the matched string, in this case, each character
3 $2   column 2

so it means, replace each character in 2nd column into the character itself + " ".
于 2012-10-05T13:11:00.223 に答える
2

のみを使用する一方向awk

awk '{ gsub( /./, "& ", $2 ); print $2; }' infile

その結果、次のようになります。

0 1 1 0 1 0 0 0 1 0 0 1 0 1 0 1 
1 0 0 0 0 1 0 0 1 0 1 1 1 0 0 1 
1 0 0 0 0 1 1 0 0 1 1 1 1 0 0 0

編集ケントと私は同じ実装を行ったので、この回答をもう少し便利にするために、次のsed1つを追加します。

sed -e 's/^[^ ]* *//; s/./& /g' infile
于 2012-10-05T13:10:30.350 に答える
2

sedの代替を追加するだけです:

sed -e 's/^.* *//;s/./& /g;s/ $//' file

3つのコマンド:

  1. 行頭の文字とスペースを削除します
  2. すべての文字をそれ自体とそれに続くスペースに置き換えます
  3. (オプション)行末の末尾のスペースを削除します
于 2012-10-05T13:16:58.177 に答える
1

sed解決。

sed 's/.* //;s/\(.\)/\1 /g'

各行の終わりに余分なスペースを追加します。式に追加;s/ $//して削除します。

于 2012-10-05T13:16:29.317 に答える
0

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

sed 's/^\S*\s*//;s/\B/ /g' /file
于 2012-10-06T07:47:03.960 に答える