在bash中保留第一行的前52000个字符

时间:2014-04-03 13:16:35

标签: bash sed awk

我有一个包含许多行的大文件,第一行有10万个字符。

我试图将第一行中的前52000个字符和第一行 In Addtion 保留到文件的其余部分,这仍然是相同的。

我已经搜索了网络,但我只找到了解决方案,其中第一个第n个字符的删除是常态。

我考虑过cut -c 1-52000,但cut会删除每一行,我只希望第一行最多可以保留52000个字符。

我检查了sed,但我找不到有用的东西。

我想到了这个

awk '{ NR==1 substr( 1, 52000) } { print }' infile

你觉得它会起作用吗?

欢迎任何提示。

8 个答案:

答案 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)

在命令组中使用内置函数和cat可以完全满足您的需求:

{ IFS= read -r; printf "%s\n" "${REPLY:0:52000}"; cat; } < file
  • 从stdin
  • 读取第一行
  • 从该行打印前52000个字符(或者更少的是行更短 - bash参数扩展无缝处理)
  • 从sdtin
  • 获取文件的其余部分

我猜测,因为文件的第一行除了普通的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 }

<强>头/尾

您也可以使用headtail的组合,例如:

(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完全符合线: - )