假设我有两个文件,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'选项来实现.我需要修改这个脚本,以便它可以在可用 …
我正在使用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) 我有两个文件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)
它有效,但速度很慢.有更快的方法吗?
我曾经有一个名为 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 分钟之间的差异...有关清理它的建议吗?
想以root身份运行bash脚本但是延迟了.怎么能实现这个?
sudo "sleep 3600; command" , or
sudo (sleep 3600; command)
Run Code Online (Sandbox Code Playgroud)
不起作用.
我有一个文件,每个文件有两个字符:
$ 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) 我正在尝试使用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机器中,我创建了一个长行并将其管道到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?
它所做的只是一遍又一遍地重复第一个论点?
这只是某种古怪的"复活节彩蛋"还是有用的.该手册页至少可以说是稀疏的.
我建立了一个库,并想/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符号链接?
gnu-coreutils ×10
bash ×5
linux ×3
gnu ×2
sorting ×2
command-line ×1
cpu ×1
join ×1
shell ×1
sudo ×1
tail ×1
top-command ×1
unicode ×1
unix ×1