如何使用linux命令在现有的制表符分配的文件中附加索引?

时间:2018-10-26 07:49:46

标签: bash shell awk

我下面有一个文件,它以制表符分隔。

TK              015_LIT NA      CAT     mask

我希望将其复制以使其较大,如下所示。

TK              015_LIT NA      CAT     mask1
TK              015_LIT NA      CAT     mask2
TK              015_LIT NA      CAT     mask3
TK              015_LIT NA      CAT     mask4
TK              015_LIT NA      CAT     mask5
TK              015_LIT NA      CAT     mask6

但是,我对它进行了如下编码,但由于mask旁边的数字始终为零,即使我对其进行了递增,也无法正常工作。我的代码如下所示。

counter=0
for start in {1..5}
do
        awk '{printf("%s \t %s \t %s \t %s \t %s \t %d \n",$1,$2,$3,$4,$5,$counter)}' ./medium/cause1
        let counter=1+$counter
        echo $counter
done

无论如何如何实现我的目标?

3 个答案:

答案 0 :(得分:1)

使用awk

$ awk '{for (i=0;i<3;i++)print $0 i+1}' file
TK              015_LIT NA      CAT     mask1
TK              015_LIT NA      CAT     mask2
TK              015_LIT NA      CAT     mask3

cat类似,但结果不同:

$ cat file file file file | cat -n
 1  TK              015_LIT NA      CAT     mask
 2  TK              015_LIT NA      CAT     mask
 3  TK              015_LIT NA      CAT     mask
 4  TK              015_LIT NA      CAT     mask

您可以使用-v参数将环境变量传递给awk。在您的代码中,counter仅是awk变量,因此每次调用时都使用0进行初始化。

答案 1 :(得分:1)

您可以使用以下awk单行代码进行操作:

 awk -v times=5 '{while(i<times) print $0(++i)}' file

更改times变量以获取不同数量的行。您也可以将shell变量传递给awk,例如:

 awk -v times="$VarFromShell" '{.....

答案 2 :(得分:0)

使用nlman nlnl - number lines of files)添加行号,并使用rev将其添加到末尾(按原样适用于前9行) :):

$ for i in {1..5}; do rev file ; done |       # 5 copies coming right up - reversed
  nl -w 1 -s "" |                             # add the line number
  rev                                         # re-reverse
TK              015_LIT NA      CAT     mask1
TK              015_LIT NA      CAT     mask2
TK              015_LIT NA      CAT     mask3
TK              015_LIT NA      CAT     mask4
TK              015_LIT NA      CAT     mask5