ファイルを文字ごとに分割してデータに追加します。

ファイルを文字ごとに分割してデータに追加します。

ファイルの2番目のフィールドをアンダースコア(スペースで区切って)に分割し、2番目の部分をデータに新しいフィールド(タブとして出力)として追加する方法を簡単にしたいという質問があります。

例えば file.txt

2 1_123
2 2_345

out.tab:

2 1_123 123
2 2_345 345

すでに使用できますが、より簡単な方法はありますか?複雑すぎるようです...

paste -d' ' file.txt <(cat file.txt | cut -d'_' -f 2- ) | tr [:blank:] \\t > out.temp && mv out.temp out.tab

ベストアンサー1

すべての変換はファイル内の同じ行内でデータを混在させるため、sedやawkなどのデータを1行ずつ操作するツールを使用する方がはるかに簡単です。

sed -e 's/^[^ \t]*[ \t][^ \t]*_\([^_ \t]*\)/&\1\t/' -e 'y/ /\t/' <<<'2 1_123'

説明:正規表現を使用して、最初のフィールド(最初のスペースまたはタブまで)、2番目のフィールドから最後のアンダースコアまで、2番目のフィールドを最後のアンダースコア(\(…\)テキストを置き換えるためにグループに入れます)と一致させます。同じテキスト(&置換)を保持し、その後に一致するグループの内容(\1)が続きます。 2番目のフィールド以降のすべてのフィールドは変更されません。最後に、すべてのスペースをタブ文字で置き換えます。

sedがタブ表示をサポートしていない場合は、\t代わりにリテラルタブを使用してください。

おすすめ記事