1

最初のいくつかのフィールドが次のようになっている区切りファイルがあります。

2774013300|184500|2012-01-04 23:00:00|

最初のフィールドが 8 文字以上の特定の行を変更したいと考えています。最初の列の値を切り捨てたい。

の場合、2774013300その値を にしたい27740133

sed、できれば、または でこれを行いたいと思いawkます。

を使用するsedと、行頭で 8 桁を超える数字を見つけることができますが、それを切り捨てる方法がよくわかりません。

sed -n -e /'^[0-9]\{10,\}/p' infile

最初の 8 文字にグループ化を使用して、それらを代替コマンドで返すことができると考えていますが、その方法がよくわかりません。

awk では、最初のフィールドを検出できますが、substr を使用して最初のフィールドを変更し、残りのフィールドを返す方法がよくわからないため、完全な行が保持されます。

awk -F'|'  '{ if (length($1) > 9) { print $1; print length($1);} }' infile
4

2 に答える 2

4

状況の微妙な点に応じて、使用できます

sed 's/^\([0-9]\{8\}\)[0-9]*/\1/' infile

また

sed 's/^\([0-9]\{8\}\)[0-9]\{1,\}/\1/' infile

GNU sed を使用すると、次のように簡略化できます

sed -r 's/^([0-9]{8})[0-9]+/\1/' infile

または、必要に応じて と を追加-npます。

例:

$ sed 's/^\([0-9]\{8\}\)[0-9]*/\1/' <<<'2774013300|184500|2012-01-04 23:00:00|'
27740133|184500|2012-01-04 23:00:00|
于 2013-03-13T18:26:47.317 に答える
1

awk の使用:

awk -F'|' 'BEGIN{OFS=FS}length($1)>9{$1=substr($1, 0,9)}{print}'

例:

$ echo "2774013300|184500|2012-01-04 23:00:00|" | awk -F'|' 'BEGIN{OFS=FS}length($1)>9{$1=substr($1, 0,9)}{print}'
27740133|184500|2012-01-04 23:00:00|
于 2013-03-13T21:29:25.703 に答える