Fra*_*rth 302 bash scripting command-line truncate
我有一个文件,foo.txt包含以下行:
a
b
c
Run Code Online (Sandbox Code Playgroud)
我想要一个简单的命令,导致内容为foo.txt:
a
b
Run Code Online (Sandbox Code Playgroud)
thk*_*ala 373
使用GNU sed:
sed -i '$ d' foo.txt
Run Code Online (Sandbox Code Playgroud)
该-i选项在GNU sed早于3.95的版本中不存在,因此您必须将其用作具有临时文件的过滤器:
cp foo.txt foo.txt.tmp
sed '$ d' foo.txt.tmp > foo.txt
rm -f foo.txt.tmp
Run Code Online (Sandbox Code Playgroud)
当然,在这种情况下你也可以使用head -n -1而不是sed.
苹果系统:
在Mac OS X上(从10.7.4开始),相当于sed -i上面的命令
sed -i '' -e '$ d' foo.txt
Run Code Online (Sandbox Code Playgroud)
小智 267
这是迄今为止最快,最简单的解决方案,尤其是在大文件上:
head -n -1 foo.txt > temp.txt ; mv temp.txt foo.txt
Run Code Online (Sandbox Code Playgroud)
如果你想删除顶行使用这个:
tail -n +2 foo.txt
Run Code Online (Sandbox Code Playgroud)
这意味着输出线从第2行开始.
不要sed用于删除文件顶部或底部的行 - 如果文件很大,则非常慢.
Yos*_*oun 114
我在这里得到了所有答案的麻烦,因为我正在处理一个巨大的文件(~300Gb)并且没有任何解决方案缩放.这是我的解决方案:
dd if=/dev/null of=<filename> bs=1 seek=$(echo $(stat --format=%s <filename> ) - $( tail -n1 <filename> | wc -c) | bc )
Run Code Online (Sandbox Code Playgroud)
在字:找出你想结束了(它的最后一行的长度的文件减去长度的长度,使用该文件的长度bc),并设置位置是文件的末尾(由dd荷兰国际集团的一个字节 /dev/null到它).
这是快,因为tail开始从终端读,dd将覆盖该文件的地方,而不是复制(和解析)文件的每一行,这是其他解决方案做.
注意:这将从文件中删除行!在您自己的文件上尝试之前,对虚拟文件进行备份或测试!
ohs*_*ite 56
要从文件中删除最后一行而不读取整个文件或重写任何内容,您可以使用
tail -n 1 "$file" | wc -c | xargs -I {} truncate "$file" -s -{}
Run Code Online (Sandbox Code Playgroud)
要删除最后一行并将其打印在stdout上("弹出"它),您可以将该命令与tee:
tail -n 1 "$file" | tee >(wc -c | xargs -I {} truncate "$file" -s -{})
Run Code Online (Sandbox Code Playgroud)
这些命令可以有效地处理非常大的文件.这与Yossi的回答类似,并受其启发,但它避免使用一些额外的功能.
如果您要反复使用这些并想要错误处理和其他一些功能,可以使用以下poptail命令:https:
//github.com/donm/evenmoreutils
man*_*ngh 29
Mac用户
如果你只想删除最后一行输出而不改变文件本身呢
sed -e '$ d' foo.txt
如果你想删除输入文件本身的最后一行呢
sed -i '' -e '$ d' foo.txt
Sar*_*med 24
在Mac上,头-n -1不会工作.而且,我试图找到一个简单的解决方案[不用担心处理时间],只使用"head"和/或"tail"命令来解决这个问题.
我尝试了以下命令序列,并且很高兴我可以使用"tail"命令[使用Mac上的选项]来解决它.因此,如果您使用的是Mac,并且只想使用"tail"来解决此问题,则可以使用以下命令:
cat file.txt | tail -r | 尾巴-n +2 | 尾巴-r
1> tail -r:简单地反转输入中的行顺序
2> tail -n +2:这将打印从输入中的第二行开始的所有行
jas*_*ard 16
$表示最后一行,d表示删除:
sed '$d' ~/path/to/your/file/name
Run Code Online (Sandbox Code Playgroud)
相当于sed -i:
sed -i '' -e '$ d' ~/path/to/your/file/name
Run Code Online (Sandbox Code Playgroud)
lhf*_*lhf 13
echo -e '$d\nw\nq'| ed foo.txt
Run Code Online (Sandbox Code Playgroud)
awk 'NR>1{print buf}{buf = $0}'
Run Code Online (Sandbox Code Playgroud)
基本上,此代码说明如下:
对于第一行之后的每一行,打印缓冲行
对于每一行,重置缓冲区
缓冲区滞后一行,因此最终会打印第1行到第n-1行
| 归档时间: |
|
| 查看次数: |
320169 次 |
| 最近记录: |