SEDまたはAWKを使用して文字列を新しい列と行に移動する

SEDまたはAWKを使用して文字列を新しい列と行に移動する

タブ区切りの.csvファイルがあり、ヘッダー行情報を最初の「新しい」列に移動し、指定された行数だけ下に移動する必要があります。sedまたはなど、現在使用している標準ツールを使用したいが、awk他のツール/アプローチがより適切な場合は、提案を歓迎します。各ファイルのタイトルが変更されるため、適切な行と列に "CAT"文字列を配置する代わりにファイルをコピーする必要があります。

                            CAT
    DOG     DOG     DOG     DOG     DOG     DOG     DOG
    DOG     DOG     DOG     DOG     DOG     DOG     DOG
    DOG     DOG     DOG     DOG     DOG     DOG     DOG
    DOG     DOG     DOG     DOG     DOG     DOG     DOG

になります:

                            CAT
            DOG     DOG     DOG     DOG     DOG     DOG     DOG
            DOG     DOG     DOG     DOG     DOG     DOG     DOG
    CAT     DOG     DOG     DOG     DOG     DOG     DOG     DOG
            DOG     DOG     DOG     DOG     DOG     DOG     DOG

答え1

paste次のようにすることもできます。

編集済み

これにより、最初の行が再印刷されます。引用符がないことを使用して末尾のスペースは表示されません。

$ paste -d"\t" <(printf "\n\n\n%s" $(head -1 file)) file
                                    CAT
            DOG     DOG     DOG     DOG     DOG     DOG     DOG
            DOG     DOG     DOG     DOG     DOG     DOG     DOG
CAT         DOG     DOG     DOG     DOG     DOG     DOG     DOG
            DOG     DOG     DOG     DOG     DOG     DOG     DOG

オリジナル

$ -d"\t" <(printf "\n\n\nCAT") file
                                    CAT
            DOG     DOG     DOG     DOG     DOG     DOG     DOG
            DOG     DOG     DOG     DOG     DOG     DOG     DOG
CAT         DOG     DOG     DOG     DOG     DOG     DOG     DOG
            DOG     DOG     DOG     DOG     DOG     DOG     DOG

答え2

次のsedコマンドは私にとって効果的でした。

sed '1!s/^/\t/;4s/^/CAT/' 

説明する:

1以外の行では、行の先頭をタブ文字に置き換えます。 4行目の行の先頭をCAT文字列に置き換えます。

答え3

sed次のように使用できると思います。

  1. hold最初の行をスペースに保存
  2. 行2から始まる追加のタブ(列)を追加します(これにより、ヘッダーの元の列のソートが維持されます)。
  3. 指定された次の行(以下の例では4行を使用しました)から次のhold内容を空白に置き換え、pattern空白を削除して行の前に追加します。

$ sed -e '1h' -e '2,$s/^/\t/' -e '4{x;s/[[:space:]]//g;G;s/\n//}' file
                                CAT
                DOG     DOG     DOG     DOG     DOG     DOG     DOG
                DOG     DOG     DOG     DOG     DOG     DOG     DOG
    CAT         DOG     DOG     DOG     DOG     DOG     DOG     DOG
                DOG     DOG     DOG     DOG     DOG     DOG     DOG

答え4

使用awk:

awk -v line=4 -F '^\t*|\t+' '
  NR==1 { OFS="\t"; ins=$2 }
  NR!=line { print "","",$0 }
  NR==line { print "",ins,$0 }' file

挿入するテキストとしてヘッダー行の空でない最初のフィールドを使用するので、タブや改行を除くすべてのテキストを含めることができます。で常に2番目のフィールドとして読み取られるようにフィールド区切り文字を設定しますawk

関連情報