ファイルの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
代わりにリテラルタブを使用してください。