約8,000のレコードを含む区切りファイルがあります|
。
3列が空の場合は2列の値に変更したいと思います。私たちはこれをどのように達成しますか?
入力する:
1|100437251|
2|51414204|
3|111651604|111651604
4|8321737|8321737
5|27263401|27263401
出力:
1|100437251|100437251
2|51414204|51414204
3|111651604|111651604
4|8321737|8321737
5|27263401|27263401
sed
交換コマンドを試してみましたsed -i "s/ /$2/g" input > output
。
ベストアンサー1
そしてsed:
sed -E 's/^([^|]*\|)([^|]*)\|$/\1\2|\2/' infile
この部分は、([^|]*\|)
最初の列と区切り文字(\1
逆参照)をキャプチャします。
この部分は([^|]*)
2番目の列(\2
逆参照)をキャプチャします。
この部分は\|$
行末の最後の区切り文字をキャプチャし、その後に他の区切り文字はありません(3番目の列が空であることを意味します)。
このセクションでは、\1\2|\2
逆参照アドレスを使用して最初と2番目の列を返し、区切り文字を使用して2番目の列を再コピーします。
3番目の列が空ではなく、タブ/スペース([[:space:]]
)などの空白文字が含まれる可能性がある場合は、代わりにこの列を使用してください。
sed -E 's/^([^|]*\|)([^|]*)\|[[:space:]]*$/\1\2|\2/' infile
そしてアッ:
awk 'BEGIN{ FS=OFS="|" } $3 ~/^[[:space:]]*$/ { $3=$2 }1' infile
FSはF生産するS区切り記号、OFSの例酸素出力F生産するS次に、3番目の列が空であるか/タブ/スペースであることを確認し、その内容を2番目の列と同じように更新します。次に印刷します1
。