文件(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
中。该如何纠正?
答案 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)
使用sed
和0,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
在原位编辑时,添加-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
将文件插入到保留空间中,并在打印出保留空间之前插入行数和空白行。