2016-07-15 18 views
1

1つの列と10行のファイルがあります。すべての列の文字数は同じです(5)。このファイルから、10行5列のファイルを取得したいと思います。各行には1文字しかありません。私はどのようにLinuxでそれを行うには考えていない..どんな助け? AWKはこれをしますか?1つの列を1文字ずつ各 "n"列に分割します

実際のデータにはさらに多くの行(> 4K)と文字(> 500K)があります。ここでは、実際のデータの短いバージョンです:

31313 
30442 
11020 
12324 
00140 
34223 
34221 
43124 
12211 
04312 

所望の出力:

3 1 3 1 3 
3 0 4 4 2 
1 1 0 2 0 
1 2 3 2 4 
0 0 1 4 0 
3 4 2 2 3 
3 4 2 2 1 
4 3 1 2 4 
1 2 2 1 1 
0 4 3 1 2 

ありがとう!

+2

[編集]あなたの質問出力があまりにも、どのように見えるか、私たちを表示するための別のUNIXツールチェーンを。 –

答えて

2

あなたにもこのsedを使用することができます。

sed 's/./& /g; s/ $//' file 

3 1 3 1 3 
3 0 4 4 2 
1 1 0 2 0 
1 2 3 2 4 
0 0 1 4 0 
3 4 2 2 3 
3 4 2 2 1 
4 3 1 2 4 
1 2 2 1 1 
0 4 3 1 2 
+1

それは完璧に働いた!ありがとう! GNU sedを使って – NickSerao

+1

を実行すると、 'sed '/ //&/ 2g''を実行することができます – Sundeep

+0

はいとても良い点@Sundeep – anubhava

0

ほとんどの標準Unixツール(更新:except, apparently, with awk)ではこれほど些細なことではありません。私は、Pythonを使用します。

python -c 'import sys; map(sys.stdout.write, map(" ".join, sys.stdin))' in.txt > new.txt 

(これが最大の慣用のPythonはありませんが、それは簡単なワンライナーのために十分である。)

3

私はこれが何をしたいんだと思います:

$ awk -F '' '{ $1 = $1 }1' file 
3 1 3 1 3 
3 0 4 4 2 
1 1 0 2 0 
1 2 3 2 4 
0 0 1 4 0 
3 4 2 2 3 
3 4 2 2 1 
4 3 1 2 4 
1 2 2 1 1 
0 4 3 1 2 

入力フィールドの区切り文字は空の文字列に設定されているため、すべての文字はフィールドとして扱われます。 $1 = $1は、awkがすべてのレコードに「タッチ」し、再フォーマットされることを意味し、すべての文字の間に出力フィールドセパレータ(スペース)を挿入します。 1はawkにすべてのレコードを出力させる最短の "真の"条件です。

フィールド区切り文字を空の文字列に設定する動作は明確に定義されていないため、使用しているawkのバージョンでは動作しないことに注意してください。フィールドセパレータを異なるように設定すると、 -v FS=をご利用ください。

また、あなたはPerlで多かれ少なかれ同じことを行うことができます

perl -F -lanE 'say "@F"' file 

-a分割各入力レコードを特殊な配列@Fに。 -Fに続けて入力フィールドセパレータを空の文字列に設定します。 @Fの引用符は、リストセパレータ(デフォルトではスペース)が各要素の間に挿入されていることを意味します。

+0

あなたの答えをありがとう!私はこれを試しましたが、次のメッセージを受け取りました: "awk:フィールドセパレータFSが空です"。だから、私はそれについてgoogledと私はあなたのコードを "awk -v FS = '{$ 1 = $ 1} 1'ファイルに変更し、それは働いた!!!ご協力いただきありがとうございます! – NickSerao

0

このタスク

$ while read line; do echo $line | fold -w1 | xargs; done < file 

3 1 3 1 3 
3 0 4 4 2 
1 1 0 2 0 
1 2 3 2 4 
0 0 1 4 0 
3 4 2 2 3 
3 4 2 2 1 
4 3 1 2 4 
1 2 2 1 1 
0 4 3 1 2 
関連する問題