在文本文件的第一行和第二行之间添加空行

时间:2018-11-28 03:32:18

标签: awk sed

文件(foo.csv)包含以下条目(四列):

A 5.3 3.2 1.2 
A 2.1 3.4 6.7
A 3.4 2.1 5.6 
A 0.4 2.2 4.2

在此文件中,我想在第一行中添加总行数,然后再添加一个空行。

我希望输出如下。

4

A 5.3 3.2 1.2 
A 2.1 3.4 6.7
A 3.4 2.1 5.6 
A 0.4 2.2 4.2

这是我尝试过的。

#to get the total number of lines in the file foo.csv
t=$((wc -l foo.csv | cut -d" " -f1))
#to add an empty line 
sed -i "1i\\" foo.csv
#to insert the total number at the top; this works fine.
sed -i "1i $t" foo.csv

我需要对一堆文件执行此操作。因此,脚本将很有用。问题似乎出在sed -i "1i\\" foo.csv中。该如何纠正?

4 个答案:

答案 0 :(得分:3)

也用awk进行行计数。

$ awk 'NR==FNR{next} FNR==1{print NR-1 ORS}1' file{,}

或者,用tac...tac

$ tac file | awk '1; END{print ORS NR}' | tac

答案 1 :(得分:2)

如果您对awk表示满意,请尝试遵循。

awk -v line=$(wc -l < Input_file) 'FNR==1{print line ORS} 1'  Input_file

如果您想将输出添加到Input_file本身,则将> temp_file && mv temp_file Input_file附加到上面的代码中。

说明: 现在也为上述代码添加了说明。

awk -v line=$(wc -l < Input_file  ) '       ##Creating variable line whose value is bash command wc -l to get line count for Input_file as per OP request.
FNR==1{                                     ##Checking if line number is 1 here then do following.
  print line ORS                            ##Printing variable line here with ORS whose value is new line here.
}                                           ##Closing FNR block here.
1                                           ##awk works on method of pattern and action mentioning 1 making condition TRUE and no action will make print to happen.
'  Input_file                               ##Mentioning Input_file name here.

答案 2 :(得分:1)

使用sed0,addr2形式(请参见“地址” 下的man sed)并使用一般替换,例如,

$ sed '0,/^/s/^/4\n\n/' file
4

A 5.3 3.2 1.2
A 2.1 3.4 6.7
A 3.4 2.1 5.6
A 0.4 2.2 4.2

sed表达式只是找到行0,/^/的开头的第一次出现,然后使用4\n\n s/^/4\n\n/。 >

在原位编辑时,添加-i选项以进行原位编辑(或-i.bak创建原件(例如file.bak)的背面。

如果您对设置行数感兴趣,则可以使用命令替换使用wc -l来获取行,例如

$ sed "0,/^/s/^/$(wc -l <file2)\n\n/" file2
8

A 5.3 3.2 1.2
A 2.1 3.4 6.7
A 3.4 2.1 5.6
A 0.4 2.2 4.2
A 5.3 3.2 1.2
A 2.1 3.4 6.7
A 3.4 2.1 5.6
A 0.4 2.2 4.2

注意:使用双引号而不是单引号来扩展命令替换)

答案 3 :(得分:0)

这可能对您有用(GNU sed):

[ 1,2,3,4,5,6,7,8,9 ]

或在sed中执行所有操作:

sed -e '1e wc -l <file' -e '1H;1g' file

这使用sed -e '1e sed "$=;d" file' -e '1H;1g' file 命令来评估unix命令。通常,这是通过使用e命令的e标志来完成的,但是在这种情况下,可以在地址后使用它。

使用管道的替代方法:

s

或:

wc -l <file | sed '1G' - file

使用wc或sed命令的结果作为第一个输入文件。

回想起来,最简单的解决方案(尽管不是最有效的):

sed '$=;d' file | sed '1G' - file

将文件插入到保留空间中,并在打印出保留空间之前插入行数和空白行。