标签: gnu-coreutils

如何使用Unix连接获取外连接中的所有字段?

假设我有两个文件,en.csv并且sp.csv,每个都包含正好两个逗号分隔的记录:

en.csv:

1,dog,red,car
3,cat,white,boat
Run Code Online (Sandbox Code Playgroud)

sp.csv:

2,conejo,gris,tren
3,gato,blanco,bote
Run Code Online (Sandbox Code Playgroud)

如果我执行

join -t, -a 1 -a 2 -e MISSING en.csv sp.csv
Run Code Online (Sandbox Code Playgroud)

我得到的输出是:

1,dog,red,car
2,conejo,gris,tren
3,cat,white,boat,gato,blanco,bote
Run Code Online (Sandbox Code Playgroud)

请注意,所有缺少的字段都已折叠.要获得"正确的"全外连接,我需要指定一种格式; 从而

join -t, -a 1 -a 2 -e MISSING -o 0,1.2,1.3,1.4,2.2,2.3,2.4 en.csv sp.csv
Run Code Online (Sandbox Code Playgroud)

产量

1,dog,red,car,MISSING,MISSING,MISSING
2,MISSING,MISSING,MISSING,conejo,gris,tren
3,cat,white,boat,gato,blanco,bote
Run Code Online (Sandbox Code Playgroud)

这种方式产生完全外连接的一个缺点是一个需要明确指定了决赛桌,这可能不容易编程的应用(如连接表的身份只有在运行时是已知的)做的格式.

最近版本的GNU join通过支持特殊格式消除了这个缺点auto.因此,join上面的最后一个命令的这种版本可以被更普遍的替换

join -t, -a 1 -a 2 -e MISSING -o auto en.csv sp.csv
Run Code Online (Sandbox Code Playgroud)

如何join在不支持该-o auto选项的版本中实现同样的效果?


背景和细节

我有一个Unix shell(zsh)脚本,用于处理多个CSV平面文件,并通过广泛使用GNU join的'-o auto'选项来实现.我需要修改这个脚本,以便它可以在可用 …

unix shell join gnu gnu-coreutils

10
推荐指数
1
解决办法
7939
查看次数

使用`tail -f`截断文件时清除屏幕

我正在使用tail -f打印不断变化的文件的内容.截断文件时,它显示如下:

blah (old)..
blah more (old)..
tail: file.out: file truncated
blah..
blah more..
Run Code Online (Sandbox Code Playgroud)

当我经常更改文件时,这会变得很混乱,因此很难看到文件的开始/结束位置.clear当文件被截断时,是否有某种方法以某种方式显示屏幕,以便它显示如下?

tail: file.out: file truncated
blah..
blah more..
Run Code Online (Sandbox Code Playgroud)

bash tail gnu-coreutils

9
推荐指数
2
解决办法
4004
查看次数

如何找到两个文件的集合差异?

我有两个文件A和B.我想找到A中不在B中的所有行.在bash /使用标准linux实用程序中,最快的方法是什么?这是我到目前为止所尝试的:

for line in `cat file1`
 do
   if [ `grep -c "^$line$" file2` -eq 0]; then
   echo $line
   fi
 done
Run Code Online (Sandbox Code Playgroud)

它有效,但速度很慢.有更快的方法吗?

bash gnu-coreutils

8
推荐指数
1
解决办法
4088
查看次数

在 Mac OS 10.6 上获得排序的、人类可读的 du 输出的最有效方法是什么?

我曾经有一个名为 dusort 的可爱别名,它会打印出一个人类可读的大小列表,用于按大小排序的顶级子目录+文件。它就像一个在终端中运行的 Mac 迷你文件灯。

但现在我的别名在我将其复制到运行 Mac OS 10.6 的新 Mac 后就被破坏了。显然,我使用的那种要么来自 fink(我试图避免在我的新 mac 上重新安装),要么 10.6 版本的功能比 10.4 版本少(可能性很小)。

这是旧的别名,有点笨拙,因为它必须运行 du 两次才能获得机器可读和人类可读的文件大小(实际上我将其保存为 ~/bin 中的脚本,并带有 #!/bin/bash但这应该不重要): sort -n +1 <(paste <(du -hd1|cut -f1) <(du -d1))|cut -f1,3

关于以下方面有什么想法:A.让它再次发挥作用吗?B. 使用 bash 魔法让这个命令更优雅?

我知道我可以通过将 du 输出复制到临时文件或 fifo 或类似的废话来解决此问题,但这变得很荒谬。我决定来这里寻求帮助,以改掉我笨拙的狂欢习惯。请指教。:)

编辑:

现在我想了一下,这是有效的:

sort <(paste <(du -d1|cut -f1) <(du -hd1))|cut -f2,3
Run Code Online (Sandbox Code Playgroud)

不过,这似乎是一个巨大的杂凑,尤其是调用 du 两次,这可能会导致大型文件树上的 5 分钟和 10 分钟之间的差异...有关清理它的建议吗?

sorting bash command-line gnu-coreutils osx-snow-leopard

7
推荐指数
1
解决办法
2092
查看次数

使用sudo运行延迟命令

想以root身份运行bash脚本但是延迟了.怎么能实现这个?

sudo "sleep 3600; command" , or
sudo (sleep 3600; command)
Run Code Online (Sandbox Code Playgroud)

不起作用.

bash sudo gnu-coreutils

7
推荐指数
1
解决办法
5139
查看次数

为什么排序-u将U + 2161和U + 2162视为同一个字符?

我有一个文件,每个文件有两个字符:

$ cat roman
?
?
Run Code Online (Sandbox Code Playgroud)

当我对此文件进行排序时sort -u,只显示一行:

$ sort -u roman
?
Run Code Online (Sandbox Code Playgroud)

?是代码点U + 2161,?是代码点U + 2162.为什么只显示一行?

编辑

$ xxd -g 1 roman
0000000: e2 85 a1 0a e2 85 a2 0a                          ........


$ locale
LANG=en_US.UTF-8
LANGUAGE=en_US:en
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC=en_US.UTF-8
LC_TIME=en_US.UTF-8
LC_COLLATE="en_US.UTF-8"
LC_MONETARY=en_US.UTF-8
LC_MESSAGES="en_US.UTF-8"
LC_PAPER=en_US.UTF-8
LC_NAME=en_US.UTF-8
LC_ADDRESS=en_US.UTF-8
LC_TELEPHONE=en_US.UTF-8
LC_MEASUREMENT=en_US.UTF-8
LC_IDENTIFICATION=en_US.UTF-8
LC_ALL=
Run Code Online (Sandbox Code Playgroud)

sort是GNU coreutils.

$ sort --version
sort (GNU coreutils) 8.15
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 …
Run Code Online (Sandbox Code Playgroud)

linux sorting unicode gnu-coreutils

7
推荐指数
1
解决办法
193
查看次数

top命令的CPU使用率计算

我正在尝试使用GNU coreutil top的公式计算CPU使用率百分比.但是top使用了一些half_total来计算百分比,即百分比增加0.5.

在top的源代码的 utils.c中,以下行(3.8 beta1,行号:459): -

*out ++ =(int)((*diffs ++*1000 + half_total)/ total_change);

这转换为:((*diffs ++*1000)/ total_change)+ 1/2因此,它总是给出一个数字,即:"10倍百分比,再加上0.5".因此,如果百分比为x,则返回10x + 0.5.

谁能解释这个平均值是如何计算的?或至少有一些指针,我可以得到帮助?

PS:为什么我们不能(*diffs++/total_change) * 100用来获得所需的百分比?

Top的源代码位于: - http://downloads.sourceforge.net/unixtop/top-3.8beta1.tar.gz?modtime=1210117842&big_mirror=0

linux cpu gnu-coreutils top-command

6
推荐指数
1
解决办法
6795
查看次数

linux gnu less:复制+粘贴时缓冲区中的长行分解

在我的一台Linux机器中,我创建了一个长行并将其管道到gnu,不像这样:

seq -w 1 999 | xargs echo | less
Run Code Online (Sandbox Code Playgroud)

如果我选择从gnu less(版本394)出现的文本,并将其复制+粘贴到其他地方,则将长行分解为多行,每行与终端的宽度一样长,这与我的预期不符.

如果我在不同的Linux盒子(更少的版本444)中做同样的事情,我可以从gnu less缓冲区中选择并将其复制+粘贴到其他地方作为一条长行,这是所需的行为.见图:

在此输入图像描述

粘贴到emacs中的效果,首先是未受影响的效果,下面是期望的效果:

在此输入图像描述

在两个linux框中,如果我使用cat而不是更少并从终端输出中选择,我也可以复制+粘贴一行中的所有内容:

seq -w 1 999 | xargs echo > /tmp/f
cat /tmp/f
Run Code Online (Sandbox Code Playgroud)

相比之下,在两个linux框中,该more命令的行为相反,在选择复制和粘贴时也将长行分解为多行:

seq -w 1 999 | xargs echo > /tmp/f
more /tmp/f
Run Code Online (Sandbox Code Playgroud)

可能会发生什么想法?如何从gnu less缓冲区复制+粘贴,具有我所看到的相同的一致行为cat

bash gnu gnu-coreutils

6
推荐指数
1
解决办法
1910
查看次数

coreutils计划的重点是什么?

它所做的只是一遍又一遍地重复第一个论点?

这只是某种古怪的"复活节彩蛋"还是有用的.该手册页至少可以说是稀疏的.

linux gnu-coreutils

6
推荐指数
1
解决办法
640
查看次数

使用coreutils install安装符号链接

我建立了一个库,并想/usr/local/lib使用coreutils 安装该库install。构建的结果如下所示:

libfoo.so -> libfoo.so.1
libfoo.so.1 -> libfoo.so.1.1
libfoo.so.1.1
Run Code Online (Sandbox Code Playgroud)

我想按install原样保留符号链接和文件/usr/local/lib。但是,如果我跑步

install libfoo* /usr/local/lib
Run Code Online (Sandbox Code Playgroud)

符号链接已解析,/usr/local/lib外观如下:

libfoo.so
libfoo.so.1
libfoo.so.1.1
Run Code Online (Sandbox Code Playgroud)

换句话说,这些都是真实文件,没有符号链接。

的联机帮助页install不包含有关解析符号链接的任何信息。我如何install符号链接?

shared-libraries gnu-coreutils

6
推荐指数
1
解决办法
795
查看次数