web-dev-qa-db-ja.com

Linuxでファイルの特定の列にスペースを追加する方法

この形式で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
3
Rozer

素朴だが率直:

$ 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番目の試合のために。

5
Kusalananda

必要なのは単純な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です。

4
GMaster

すべての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
4
Ed Morton

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ソリューションが含まれていました)

3
Alex Stragies

ここで入力するのに完全に怠惰で、

sed -E "s/([0-9]{2})/\1 /g; s/ +/ /g" file1

すべての数字のペアの後にスペースを入れてから、複数のスペースをシングルトンに減らします。

または、おそらくもっと怠惰

sed 's/./& /4;s/./& /2' file1
2
bu5hman

入力データが正確に描かれている場合、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
2
iruvar