この形式で1000行を含むテキストファイルがあります。
001122 abc def ghi
334455 xyz aaa bbb
667788 ccc ccc ddd
特定の列にスペースを追加することにより、Linuxコマンドを使用してこの形式に変換するにはどうすればよいですか?
00 11 22 abc def ghi
33 44 55 xyz aaa bbb
66 77 88 ccc ccc ddd
素朴だが率直:
$ sed 's/\(..\)\(..\)\(..\)/\1 \2 \3/' file
00 11 22 abc def ghi
33 44 55 xyz aaa bbb
66 77 88 ccc ccc ddd
つまり、各行で2文字の最初の3つのグループを一致させて収集し、置換文字列にスペースを挿入してスペースを空けます。
豪華ですが考える必要があります:
$ sed 's/../ &/3; s/../ &/2' file
00 11 22 abc def ghi
33 44 55 xyz aaa bbb
66 77 88 ccc ccc ddd
この最初の式は、各行の..
の3番目の一致をスペースに置き換え、その後に..
が一致したものを続けます。もう一度、しかし2番目の試合のために。
必要なのは単純なsedコマンドだけです(実際のファイルでfilename
を変更してください)。
sed -E 's|([0-9]{2})([0-9]{2})([0-9]{2})[[:blank:]]*(.*)|\1 \2 \3 \4|g' filename
ソースファイル(filename
)をその場で変更する場合は、-i
オプション:
sed -i -E 's|([0-9]{2})([0-9]{2})([0-9]{2})[[:blank:]]*(.*)|\1 \2 \3 \4|g' filename
説明:
([0-9]{2})
は、2桁のグループに3回一致します
(.*)
は、すべての文字であるその他すべてに一致します
[[:blank:]]*
は、タブを含むスペース文字に一致します
\1
使って \4
は一致したグループです
これはGNU sed
でのみ機能することに注意してください。ほとんどすべての主流のLinuxディストリビューションにはGNU Linux。macOSを使用している場合、インストールされているGNU sedがgsed
。として利用可能でない限り、sedはBSD sedです。
すべてのUNIXボックスの任意のシェルで任意のawkを使用して、変更する列を指定し、その列の文字に依存しないようにします。
$ awk -v c=1 '{gsub(/../,"& ",$c); sub(/ $/,"",$c)}1' file
00 11 22 abc def ghi
33 44 55 xyz aaa bbb
66 77 88 ccc ccc ddd
$ awk -v c=2 '{gsub(/../,"& ",$c); sub(/ $/,"",$c)}1' file
001122 ab c def ghi
334455 xy z aaa bbb
667788 cc c ccc ddd
$ awk -v c=3 '{gsub(/../,"& ",$c); sub(/ $/,"",$c)}1' file
001122 abc de f ghi
334455 xyz aa a bbb
667788 ccc cc c ddd
Awkのスペースの任意の数/位置の汎用バージョン:
awk -v s='2,4' '{f=!split(s,a,",");for(i in a){r="^.{"a[i]+f++"}";gsub(r,"& ")}}1'
00 11 22 abc def ghi
⋮
スペース以外の文字を挿入できる、より強力なバージョン:
spacers(){
awk -v s="$1" '{f=!split(s,a,/[^*0-9]*/);split(s,p,/[*0-9]*/);
for(i in a){if(""==b=a[i])continue;
r="^.{"(b!="*"?b+f++:length($0))"}";
gsub(r,"&"p[i+1])}} 1' $2;}
そのようにして、あなたは行うことができます:
spacers '0|2 4 6|[email protected] |* |' file
|00 11 22| [email protected] | def ghi |
これは、組織モードのテーブルを作成し、クリップボードに直接パイプするのに最適です。
注:シェル関数は、STDINを介してデータも受け入れます。
(この回答の以前のバージョンには、sedを最終的な置換に使用した一般的なawkソリューションが含まれていました)
ここで入力するのに完全に怠惰で、
sed -E "s/([0-9]{2})/\1 /g; s/ +/ /g" file1
すべての数字のペアの後にスペースを入れてから、複数のスペースをシングルトンに減らします。
または、おそらくもっと怠惰
sed 's/./& /4;s/./& /2' file1
入力データが正確に描かれている場合、GNU cut
はオプションです。--output-delimiter
は明示的にスペースに設定する必要があります。これは、他のいくつかの回答とは異なり、非常に厳密なソリューションとなり、最初のフィールドで可変文字列長を処理する柔軟性と、操作する任意のフィールドを指定する機能の両方に欠けています。
cut -c1-2,3-4,5- --output-delimiter=' ' <file
00 11 22 abc def ghi
33 44 55 xyz aaa bbb
66 77 88 ccc ccc ddd