tsv / csvの大きな列の間で文字を切り取る方法は?

tsv / csvの大きな列の間で文字を切り取る方法は?

CSVファイルがあります。

1,abcde aa aaaa aaa aaaa abcde,4
2,efghi ooo oooo ooo oooo efghi,5

最初と最後の5文字で2列目を切り取り、3点で埋めるにはこの列が必要です。この目標を達成する方法は?

1,abcde ... abcde,4
2,efghi ... efghi,5

ベストアンサー1

解決sed

sed -E 's/(.*,.{5}).*(.{5},.*)/\1...\2/'

2番目の「列」(フィールド)が9文字以下の場合、入力は変更されずに保持されますが、正確に10文字でも「」が挿入されます(任意の文字を置き換えなくても)。

     入力する                       出力
9,abcdefghi,z 9,abcdefghi,z
(お金はそのまま維持してください)
10,abcdefghij,z 10,abcde...fghij,z
(参考としてこれはもっと長く入力より。 )

キャスの答え2番目のフィールドが置き換えるのに十分な長さであることを明示的に確認することをお勧めします。私の答えは質問をすることだから説明する(3つのポイントを挿入)表示されるもの(スペース+ドット3つ+スペースを挿入または入力にスペースを残す)の代わりに、最初の5つと最後の5つの間に4つ以上の異なる文字がある場合に恩恵を受けます。この問題を処理するには、次のコマンドを使用できます。

sed -E 's/(.*,.{5}).{4,}(.{5},.*)/\1...\2/'
     入力する                     出力
10,abcdefghij,z 10,abcdefghij,z
(お金はそのまま維持してください)
13,abcdefghijklm,z 13,abcdefghijklm,z
(まだ変化はありません)
14,abcdefghijklmn,z 14,abcde...jklmn,z
(入力した文字より1文字短い)
20,abcdefghijklmnopqrst,z 20,abcde...pqrst,z

.{4,}4つ以上の文字を一致させます。もちろん負数ではなく整数4に変更する。たとえば、繰り返されるcasに対して提案された回答を使用するには、をmin=20使用します  .{11,}

おすすめ記事