他のフィールドの値に基づいてフィールドの値を見つけて置き換える方法は?

他のフィールドの値に基づいてフィールドの値を見つけて置き換える方法は?

このようなファイルがあります。

IMS00|20140101|Unix|Jan14
IMS01|20140201|Unix|Feb14
IMS02|20140301|Unix|Mar14
IMS03|20140101|Unix|Jan14
IMS04|20140201|Unix|Feb14

私の基準は、列1の値がある場合はIMS00列4の値をJan14に置き換え、Jan15 列1の値がある場合はIMS01列4の値をFeb14に置き換える必要があることですFeb15

これはどのように達成できますか?

答え1

あなたの質問は非常に明確ではありません。たとえば、あなたが書いたコードでは、ドットとして後でIMS00呼び出されます。また、代わりにIMS.00列数を変更することも可能でなければなりません。とにかく、あなたは探しているでしょう43

awk 'BEGIN{FS=OFS="|"}$1=="IMS00"{$4="Jan15"}$1=="IMS01"{$4="Feb15"}1' file

このBEGINブロックは最初に一度だけ実行され、フィールド区切り記号FSと出力フィールド区切り記号OFSをに設定します|。結局、すべてを印刷します1

答え2

Perlでは、次のようにすることができます。

perl -pe 's/^(IMS00\|.*\|).*/$1Jan15/; s/^(IMS01\|.*\|).*/$1Feb15/;' file

答え3

以下はPythonソリューションです。

#!/usr/bin/env python2
with open('file.txt') as f:
    for line in f:
        if line.startswith('IMS00'):
            print line.replace('Jan14', 'Jan15')
        elif line.startswith('IMS01'):
            print line.replace('Feb14', 'Feb15')

スクリプトはファイルの各行を読み取り、行が指定された文字列で始まるかどうかを確認します。その場合、行の必要な部分は置換文字列で置き換えられます。

関連情報