我知道我可以使用类似cat test.txt | pr -w 80将行换行至 80 个字符宽的方法,但这会在打印行的顶部和底部放置大量空间,并且在某些系统上无法正常工作
强制以特定宽度换行的长行文本文件的最佳方法是什么?
如果你能防止打断的话,加分。
我想解析一个变量(在我的例子中它是开发工具包版本)以使其 dot( .) 免费。如果version='2.3.3',所需的输出是233。
我尝试如下,但它需要.替换为另一个给我的字符2_3_3。如果tr . ''能奏效就好了。
1 VERSION='2.3.3'
2 echo "2.3.3" | tr . _
Run Code Online (Sandbox Code Playgroud) 我的一个巨大的(最多 2 GiB)文本文件包含其中每一行的大约 100 个精确副本(在我的情况下没用,因为该文件是一个类似 CSV 的数据表)。
我需要的是在保持原始序列顺序的同时删除所有重复(最好,但可以为了显着的性能提升而牺牲)。结果中的每一行都是唯一的。如果有 100 条相等的行(通常重复项分布在整个文件中并且不会是邻居),则只剩下一种。
我已经用 Scala 编写了一个程序(如果您不了解 Scala,请考虑使用 Java)来实现这一点。但也许有更快的 C 编写的本地工具能够更快地做到这一点?
更新:awk '!seen[$0]++' filename只要文件接近 2 GiB 或更小,该解决方案似乎对我来说很好用,但现在我要清理 8 GiB 文件,它不再起作用。在配备 4 GiB RAM 的 Mac 和配备 4 GiB RAM 和 6 GiB 交换的 64 位 Windows 7 PC 上,似乎无穷无尽,只是内存不足。鉴于这种经验,我并不热衷于在具有 4 GiB RAM 的 Linux 上尝试它。
因此,当我使用我正在处理的特定日志集时,拉开一个文件cat然后使用它grep来获取匹配的行只会让我走到这一步。它需要一种将行与模式匹配的方法,但仅在匹配后返回行的部分。比赛前后的部分将始终不同。我玩过使用sedor awk,但无法弄清楚如何过滤该行以在比赛前删除部分,或者在比赛后返回部分,两者都可以。这是我需要过滤的行的示例:
2011-11-07T05:37:43-08:00 <0.4> isi-udb5-ash4-1(id1) /boot/kernel.amd64/kernel: [gmp_info.c:1758](pid 40370="kt: gmp-drive-updat")(tid=100872) new group: <15,1773>: { 1:0-25,27-34,37-38, 2:0-33,35-36, 3:0-35, 4:0-9,11-14,16-32,34-38, 5:0-35, 6:0-15,17-36, 7:0-16,18-36, 8:0-14,16-32,34-36, 9:0-10,12-36, 10-11:0-35, 12:0-5,7-30,32-35, 13-19:0-35, 20:0,2-35, down: 8:15, soft_failed: 1:27, 8:15, stalled: 12:6,31, 20:1 }
Run Code Online (Sandbox Code Playgroud)
我需要的部分是“停滞”后的一切。
这背后的背景是我可以找出某些东西停顿的频率:
cat messages | grep stalled | wc -l
Run Code Online (Sandbox Code Playgroud)
我需要做的是找出某个节点停顿了多少次(由“停顿”之后每个冒号之前的部分表示。如果我只是为此(即 20 :)grep,它可能会返回软失败的行,但是没有停顿,这对我没有帮助。我只需要过滤停顿的部分,这样我就可以从那些停顿的节点中搜索特定节点。
出于所有意图和目的,这是一个带有标准 GNU 核心实用程序的 freebsd 系统,但我无法安装任何额外的东西来提供帮助。
如何从一个 700?GB 的文本文件中删除前 3 亿行,该系统的总磁盘空间为 1?TB,可用空间为 300?GB?(我的系统有 2?GB 的内存。)我找到的答案使用 sed、tail、head:
但我认为(请纠正我)我无法使用它们,因为磁盘空间被限制为 1?TB,并且它们在处理过程中生成一个新文件和/或有一个 tmp 文件。
该文件包含 JSON 格式的数据库记录。
我有多个文件在前 5-10 行中包含 ascii 文本信息,然后是列表良好的矩阵信息。在 shell 脚本中,我想删除前几行文本,以便我可以在另一个程序中使用纯矩阵信息。如何使用 bash shell 命令来执行此操作?
如果有任何帮助,我正在使用 RedHat 和 Ubuntu linux 系统。
我想解码 URL 编码,是否有任何内置工具可以执行此操作,或者谁能为我提供sed可以执行此操作的代码?
我确实通过unix.stackexchange.com和互联网进行了一些搜索,但我找不到任何用于解码 url 编码的命令行工具。
我想要做的只是就地编辑txt文件,以便:
%21 变成 !%23 变成 #%24 变成 $%26 变成 &%27 变成 '%28 变成 (%29 变成 )等等。
是否有标准工具可以将字节的整数计数转换为人类可读的最大可能单位大小计数,同时将数值保持在 1.00 和 1023.99 之间?
我有我自己的 bash/awk 脚本,但我正在寻找一个标准工具,它可以在许多/大多数发行版中找到......更普遍可用的东西,理想情况下有简单的命令行参数,和/或可以接受管道输入。
以下是我正在寻找的输出类型的一些示例。
1 Byt
173.00 KiB
46.57 MiB
1.84 GiB
29.23 GiB
265.72 GiB
1.63 TiB
Run Code Online (Sandbox Code Playgroud)
这是bytes-human脚本(用于上述输出)
awk -v pfix="$1" -v sfix="$2" 'BEGIN {
split( "Byt KiB MiB GiB TiB PiB", unit )
uix = uct = length( unit )
for( i=1; i<=uct; i++ ) val[i] = (2**(10*(i-1)))-1
}{ if( int($1) == 0 ) uix = 1; else while( $1 < val[uix]+1 ) uix--
num = $1 …Run Code Online (Sandbox Code Playgroud) 我有一个巨大的(70GB)一行文本文件,我想替换其中的一个字符串(令牌)。我想<unk>用另一个虚拟令牌(手套问题)替换令牌。
我试过sed:
sed 's/<unk>/<raw_unk>/g' < corpus.txt > corpus.txt.new
Run Code Online (Sandbox Code Playgroud)
但输出文件corpus.txt.new有零字节!
我也尝试过使用 perl:
perl -pe 's/<unk>/<raw_unk>/g' < corpus.txt > corpus.txt.new
Run Code Online (Sandbox Code Playgroud)
但我遇到了内存不足错误。
对于较小的文件,上述两个命令都有效。
如何替换字符串是这样的文件? 这是一个相关的问题,但没有一个答案对我有用。
编辑:如何将文件拆分为 10GB(或其他任何大小)的块并应用sed到其中的每一个然后将它们合并cat?那有意义吗?有没有更优雅的解决方案?
text-processing ×10
sed ×3
bash ×2
files ×2
large-files ×2
shell-script ×2
grep ×1
units ×1
url ×1
utilities ×1