我有两个字段的巨大文本文件,第一个是字符串,第二个是整数。文件按第一个字段排序。我想在输出中得到的是每个唯一字符串一行以及相同字符串的数字总和。一些字符串只出现一次,而另一些则出现多次。例如,鉴于下面的示例数据,对于字符串 glehnia,我希望在结果中得到 10+22=32。
任何建议如何使用 gnuwin32 命令行工具或在 linux shell 中执行此操作?
谢谢!
glehnia 10 glehnia
22
glehniae 343
glehnii 923 glei
1171
glei
2283 glei
3466
gleib 914
gleiber 652
gleiberg 495
gleiberg 709
我有两个文件,huge.txt和small.txt. huge.txt有大约 600M 行,它是 14 GB。每行有四个空格分隔的单词(标记),最后是另一个带有数字的空格分隔列。small.txt有 150K 行,大小为 ~3M,一个空格分隔的单词和一个数字。
这两个文件都使用 sort 命令进行排序,没有额外的选项。两个文件中的单词都可能包含撇号 (') 和破折号 (-)。
所需的输出将包含huge.txt文件中的所有列以及匹配small.txt第一个单词huge.txt和第一个单词的第二列(数字)small.txt。
我下面的尝试惨遭失败,并出现以下错误:
cat huge.txt|join -o 1.1 1.2 1.3 1.4 2.2 - small.txt > output.txt
join: memory exhausted
Run Code Online (Sandbox Code Playgroud)
我怀疑的是,即使文件是使用以下方式预先排序的,排序顺序也不正确:
sort -k1 huge.unsorted.txt > huge.txt
sort -k1 small.unsorted.txt > small.txt
Run Code Online (Sandbox Code Playgroud)
问题似乎出现在带有撇号 (') 或破折号 (-) 的单词周围。我还尝试使用最后-d遇到相同错误的选项进行字典排序。
我尝试将文件加载到 MySQL,创建索引并加入它们,但在我的笔记本电脑上似乎需要数周时间。(我没有用于此任务的具有更多内存或快速磁盘/SSD 的计算机)
我看到了两种方法,但不知道如何实现其中任何一种。
如何以 join 命令认为文件正确排序的方式对文件进行排序?
我正在考虑计算MD5或字符串的其他一些哈希值以去除撇号和破折号,但在行尾保留数字。使用散列而不是字符串本身进行排序和连接,最后将散列“翻译”回字符串。由于只有 150K 哈希值,所以还不错。为每个字符串计算单个散列的好方法是什么?一些AWK魔法?
请参阅最后的文件示例。
巨大的样本.txt
had …Run Code Online (Sandbox Code Playgroud) 我想使用 awk 将值 262.5 舍入为 263
我已经尝试过以下方法
echo "262.5" | awk '{printf "%.f\n", $1}'
Run Code Online (Sandbox Code Playgroud)
我的预期答案是 263
我正在尝试将时间戳应用于进程的标准输出。为了应用正确的时间戳,我尝试对过程进行unbuffer 标准输出。这适用于unbuffer但不符合stdbuf我的预期。考虑以下慢速打印脚本“ slowprint ”:
#!/bin/bash
if [ $# -ne 2 ]; then
echo "usage: ${0%%/*} <file> <delay in microseconds>"
exit 1
fi
DELAY=$2 perl -pe 'BEGIN{use Time::HiRes qw(usleep)} { usleep($ENV{DELAY}) }' $
Run Code Online (Sandbox Code Playgroud)
现在比较以下应用时间戳的尝试:
stdbuf -oL ./slowprint <(ls) 100000 |
awk '{ print strftime("%H:%M:%S"), $0; fflush(); }'
Run Code Online (Sandbox Code Playgroud)
对比
unbuffer ./slowprint <(ls) 100000 |
awk '{ print strftime("%H:%M:%S"), $0; fflush(); }'
Run Code Online (Sandbox Code Playgroud)
第二个对我有用,而第一个没有,尽管我希望他们做同样的事情。目前unbuffer不合适,因为它在某些情况下会吞下错误代码(我发布了一个关于该行为的单独问题)。
在awk脚本中,我试图使用 ' (' 作为字段分隔符。但是,除非我用双反斜杠转义括号,如下所示:
BEGIN {FS=" \\("}
Run Code Online (Sandbox Code Playgroud)
这是行不通的。
如果我使用FS=" \("我得到
awk: prog:2: warning: escape sequence `\(' treated as plain `('
awk: prog:2: fatal: :, [., or [=: / (/
Run Code Online (Sandbox Code Playgroud)
输出,如果我根本不转义括号,我只会得到
awk: prog:2: fatal: :, [., or [=: / (/ 信息。
你能解释一下这种行为吗?
我想用来awk匹配文本文件中的整个单词。包括以非字母数字字符为界的单词。
例如 -
要搜索的字符串 - ABC
源文件 -
HHHABCCCCH
HHH ABC
HH(ABC)ASDAASD
HH,ABC-ASASDASD
Run Code Online (Sandbox Code Playgroud)
结果 -
HHH ABC
HH(ABC)ASDAASD
HH,ABC-ASASDASD
Run Code Online (Sandbox Code Playgroud) 我希望有一种方法让 sed 用替换(而不仅仅是匹配)替换整行,这样我就可以做这样的事情:
sed -e "/$some_complex_regex_with_a_backref/\1/"
Run Code Online (Sandbox Code Playgroud)
并让它只打印反向引用。
从这个问题来看,似乎这样做的方法是使用正则表达式来匹配整行,或者使用其他工具(如 perl)。简单地更改regexto.*regex.*并不总是有效(如该问题中所述)。例如:
$ echo $regex
\([:alpha:]*\)day
$ echo $phrase
it is Saturday tomorrow
$ echo $phrase | sed "s/$regex/\1/"
it is Satur tomorrow
$ echo $phrase | sed "s/.*$regex.*/\1/"
$ # what I'd like to have happen
$ echo $phrase | [[[some command or string of commands]]]
Satur
Run Code Online (Sandbox Code Playgroud)
假设以下情况,我正在寻找最简洁的方法来做到这一点:
我需要对无法安装其他软件的客户端 PC 上的一些问题进行故障排除,并且需要awkWindows xp 和 7 上的一些基本功能。
基本上,我需要从中剥离进程 ID,netstat以便我可以在脚本的不同部分使用它,但不知道可以执行等效于awk '{ print $4 }'. 有没有适合我的选择?显然,我对 windows cli 很陌生。
我想杀死进程名称中包含 foo 的 root 拥有的进程
sudo sh -c "ps aux | grep [f]oo | awk '{print $2}' | xargs kill -15"
Run Code Online (Sandbox Code Playgroud)
此命令失败,因为 awk 和 xargs 被忽略。
sudo sh -c "ps aux | grep [f]oo | awk '{print $2}' | xargs kill -15"
Run Code Online (Sandbox Code Playgroud)
所以 kill 收到错误的参数
kill pid ... Send SIGTERM to every process listed.
kill signal pid ... Send a signal to every process listed.
kill -s signal pid ... Send a signal to every process listed.
kill -l List …Run Code Online (Sandbox Code Playgroud) 我想在 awk 中连接字符串变量。我怎样才能做到这一点?我试过:
BEGIN{
t="."
r=";"
w=t+r
print w}
Run Code Online (Sandbox Code Playgroud)
但我不工作。输出:
0
Run Code Online (Sandbox Code Playgroud)
或者我想添加变量和函数结果。输入:
t t t t
a t a ta
ata ta a a
Run Code Online (Sandbox Code Playgroud)
脚本:
{
key="t"
print gsub(key,"")#<-it's work
b=b+gsub(key,"")#<- it's something wrong
}
END{
print b}#<-so this is 0
Run Code Online (Sandbox Code Playgroud)
输出:
4
2
2
0#<-the last print
Run Code Online (Sandbox Code Playgroud)