私は4つの部分で構成される非常に長いIDを持っています。
AKJHGFGUIKL,OIUYT,KJHBTYUI,98765434567
RTYUIKHGFGH,TYUJI,TGHYJKJKLJKL,6789876
ETRYTUUI,YTYUIL,UIOKJHGFGH,34567898766
新しい行に数字を入れて3番目のカンマを削除したいです。
AKJHGFGUIKL,OIUYT,KJHBTYUI
98765434567
RTYUIKHGFGH,TYUJI,TGHYJKJKLJKL
6789876
ETRYTUUI,YTYUIL,UIOKJHGFGH
34567898766
どうすればいいですか?
答え1
GNUの使用sed
:
sed "s/,/\n/3; G" file
ETRYTUUI,YTYUIL,UIOKJHGFGH
34567898766
説明する
答え2
awk -F, -vOFS=, '{print $1,$2,$3; print $4; print ""}' file
希望の出力を生成します
答え3
いくつかのPerlメソッド:
$ perl -pe 's/,([^,]+)$/\n$1\n/' file
AKJHGFGUIKL,OIUYT,KJHBTYUI
98765434567
RTYUIKHGFGH,TYUJI,TGHYJKJKLJKL
6789876
ETRYTUUI,YTYUIL,UIOKJHGFGH
34567898766
これは-p
、「入力ファイルを1行ずつ読み、与えられたスクリプトを適用した後に各行を印刷する-e
」という意味です。は代替演算子で、でs/foo/bar/
置き換えられます。ここでは、行末()までのカンマと1つ以上の非カンマ文字()が一致します。周囲の括弧は一致するものすべてを「キャプチャ」するので、これを演算子の右側にあると参照できます。したがって、これは最後のコンマの後のテキストを改行文字に置き換え、次に一致するテキスト、別の改行文字に置き換えます。foo
bar
[^,]+
$
([^,]+)
$1
3番目のカンマが最後のコンマであるかどうかわからない場合は、次のことができます。
perl -pe 's/([^,]+,){3}\K(.+)/\n$2\n/' file
または
perl -pe 's/(.+?,.+?,.+?),(.+)/$1\n$2\n/' file
楽しみにいくつかをさらに紹介します。
perl -pe 's/([^,]+,){3}\K(.+)/\n$2\n/' file
perl -F, -pe '$k=pop(@F); $_=join(",", @F)."\n$k\n"' file
perl -F, -le 'print join ",", @F[0..2],"\n@F[3..$#F]\n"' file
答え4
awk -F, '{print $1, $2, $3,"\n"$4}'