使用 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 号以外的行上,用制表符替换该行的开头。在第四行,将行的开头替换为 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

这将使用标题行的第一个非空白字段作为要插入的文本,因此它可以包含除制表符或换行符之外的任何文本。设置字段分隔符,以便始终将其读取为 中的第二个字段awk

相关内容