我有一个包含许多行的大文件,第一行有10万个字符。
我试图将第一行中的前52000个字符和第一行 In Addtion 保留到文件的其余部分,这仍然是相同的。
我已经搜索了网络,但我只找到了解决方案,其中第一个第n个字符的删除是常态。
我考虑过cut -c 1-52000
,但cut
会删除每一行,我只希望第一行最多可以保留52000个字符。
我检查了sed
,但我找不到有用的东西。
我想到了这个
awk '{ NR==1 substr( 1, 52000) } { print }' infile
你觉得它会起作用吗?
欢迎任何提示。
答案 0 :(得分:4)
如果您确定第一行包含超过52000个字符,则可以使用head
。话说:
head -c 52000 filename
将从指定文件生成前52000个字节(请注意,指定的字节不限于第一行)。
来自man head
:
-c, --bytes=[-]K
print the first K bytes of each file; with the leading `-',
print all but the last K bytes of each file
使用head
将产生所需结果的变体(仅从第一行开始)将是:
head -1 filename | head -c 52000
答案 1 :(得分:4)
这个怎么样:
dd if=yourfile bs=52000 count=1 2>/dev/null | head -n 1
答案 2 :(得分:4)
在命令组中使用bash内置函数和cat
可以完全满足您的需求:
{ IFS= read -r; printf "%s\n" "${REPLY:0:52000}"; cat; } < file
我猜测,因为文件的第一行除了普通的cat
之外都有,所以性能应该与其他答案相当好。
答案 3 :(得分:3)
您可以使用awk:
awk 'NR==1{print substr($0, 1, 52000); exit}' file
仅打印第1行的52000个字符。
答案 4 :(得分:3)
使用perl
:
perl -lpe '/^(.{52000})/ and $_=$1 if $.==1' file
或强>
perl -lpe '$_=substr($_,0,52000) if $.==1' file
答案 5 :(得分:2)
如果我理解正确,你想将第一行剪辑为52000个字符,并保持文件的其余部分不变。
<强> AWK 强>
您的awk
解决方案几乎可以使用,只需将其更改为:
awk 'NR==1 { $0=substr($0, 1, 52000) } 1'
最后的1
隐式执行{ print $0 }
。
<强>头/尾强>
您也可以使用head
和tail
的组合,例如:
(head -n 1 file | cut -c1-52000; tail -n+2 file)
<强>测试强>
你可以这样测试:
(printf 123456789; seq 5) > file
使用awk
进行测试:
awk 'NR==1 { $0=substr($0, 1, 5) } 1' file
使用head
/ tail
进行测试:
(head -n 1 file | cut -c1-5; tail -n+2 file)
两种情况下的输出:
12345
2
3
4
5
答案 6 :(得分:0)
注意:这不起作用。 Sed似乎无法处理大于255个字符的重复次数:
sed '1s/\(.\{1,52000\}\).*/\1/'
答案 7 :(得分:0)
sed '1 {s/\(\(\(.\{52\}\)\{100\}\)\{10\}\).*/\1/;}' YourFile
重复计数的组(组)似乎工作,但想象一下如果你想要65427 char完全符合线: - )