web-dev-qa-db-ja.com

awkを使用して列の一部を削除する方法

私はこれを持っています:

2018:01:02-23:52:48
2018:01:02-23:52:48
2018:01:02-23:52:48
2018:01:03-09:26:20
2018:01:03-09:26:20

1日あたりのメッセージ数を並べ替えるために、日付ではなく時間を保持したいのですが。

2018:01:02
2018:01:02
2018:01:02
2018:01:03
2018:01:03

できればawkでやりたい。

5
Namless
  • awk

    awk -F- '$0=$1' file
    
  • 切る

    cut -d- -f1 file
    
  • sed

    sed 's/-.*//' file
    
  • Perl

    Perl -pe 's/-.*//' file
    
13
jimmij

単にawkで:

awk -F'-' '{ print $1 }' file
  • -F'-'-扱います-(ダッシュ)をフィールド区切り文字として

しかし、あなたの単純なケースでは、grepアプローチはさらに単純になります:

grep -o '^[^-]*' file
7
RomanPerekhrest

入力onlyにタイムスタンプが含まれている場合、フィールド区切り記号としてダッシュを設定して、最初のフィールドのみを印刷するのは簡単です。

$ awk -F- '{print $1}' input
2018:01:02
2018:01:02

ただし、他にも何かある場合は、input2含む

2018:01:02-23:52:48 some data 
2018:01:02-23:52:48 something else

次に、残りの行を削除します。他の処理では、フィールドセパレーターも変更したくない場合があります。しかし、最初のフィールドで単純な置換を行い、結果の行を出力できます。

$ awk '{sub(/-.*/, "", $1)} 1' input2
2018:01:02 some data
2018:01:02 something else
4
ilkkachu

Pythonで実行

#!/usr/bin/python
import subprocess
import re
h=open('filename','r')
for  i in h:
    print i.split('-')[0].strip()

出力

2018:01:02
2018:01:02
2018:01:02
2018:01:03
2018:01:03
0

以下のawkサブストリングメソッドで同じことを達成しました

 awk '{print substr($1,1,10)}'  filename

出力

2018:01:02
2018:01:02
2018:01:02
2018:01:03
2018:01:03
0

gNU awkより

$ awk 'BEGIN{FS="[:-]"} {print $1":"$2":"$3 }' file

または

$ awk 'BEGIN{FPAT="[0-9]+"}{print $1":"$2":"$3 }' file

上記の日付区切り文字の印刷をお好みに変更できます

$ awk 'BEGIN{FS="[:-]"}{print $1"/"$2"/"$3 }' file
2018/01/02
2018/01/02
2018/01/02
2018/01/03
2018/01/03
0
abdan