文字とフィールドを同時に切り取る

文字とフィールドを同時に切り取る

次の記録があります。

2011-05-29 17:51:34 => 'HS|CMGC|RN431|CI13950|CH7-4a37-afe2-acabfc9d262d|DA110529|TI175133|'

最終出力は次のようになります。

2011-05-29 17:51:34  CI13950

次のようにカットを使用して各部分を取得できます。

$ cut -c 1-19
2011-05-29 17:51:34
$ cut -d  '|' -f 4
CI13950

2つを組み合わせることはできません。

$ cut -c 1-19 -d  '|' -f 4
cut: only one type of list may be specified

どんな提案がありますか?

答え1

一カットが私の役割を果たします。さらに減らすために2回実行することもできますが、次のようなcutものを使用する必要があるようです。awksedまたはperl代わりに。

複数の実行の例cut:

cut -f 2 | cut -c 3-6

使用例はperlデータラインで動作します。

perl -pne "s/=> '([^|]+\|){3}([^|]+)/\2/g"

sedコメントにあるFredのバージョンは次のとおりです。

sed -re "s/=> ([^|]*\|){3}([^|]*).*/\2/"

答え2

awk '{split($NF,x,"|"); print $1, $2, x[4]}'

答え3

この問題は次のとおりです。奇妙にもおなじみしかし、実際にはそれが最初だと思います。

私が見た最も簡単で読みやすい方法は、次のようにAwkを使用することです。

awk -F'|' '{print substr($0,1,19), $4}' text.txt

これは正確にcut -c 1-19 -d '|' -f 4操作コードであることを除いて、試したコマンドと同じです。 ;)

関連情報