我有一个以制表符分隔的 .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
如下:
- 将第一行保存到
hold
空格中 - 从第 2 行开始添加一个额外的制表符(列)(这将保留标题的原始列对齐方式)
- 在指定的下一行(我在下面的示例中使用了第 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
。