为了能够将一些数据导入某个工具,我必须从这种格式转换一个 CSV 文件
"data","data","data data","data","123"
Run Code Online (Sandbox Code Playgroud)
变成这种格式
data;data;data data;data;123
Run Code Online (Sandbox Code Playgroud)
列从不包含任何",;或者,但可以有空格。目前我使用以下
sed -e 's/","/;/g' -e 's/"//g' input.csv > output.csv
Run Code Online (Sandbox Code Playgroud)
虽然这很好用,但我想知道这是否可以更优雅地完成,即
感谢您的输入!
我有两个字段的巨大文本文件,第一个是字符串,第二个是整数。文件按第一个字段排序。我想在输出中得到的是每个唯一字符串一行以及相同字符串的数字总和。一些字符串只出现一次,而另一些则出现多次。例如,鉴于下面的示例数据,对于字符串 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) 我已经摆弄了一段时间了,似乎无法弄清楚。我想要做的是用单个 # 替换文件中的所有数字。
听起来很简单,它应该是,但我无法理解它。任何帮助,将不胜感激。
我到目前为止(但不起作用)是:
echo "fdsafdsa 32432 dsafdas" | sed 's/[0-9]+/#/g'
Run Code Online (Sandbox Code Playgroud)
我期望的输出是:
fdsafdsa # dsafdas
Run Code Online (Sandbox Code Playgroud)
但是 sed 给了我相同的字符串,没有任何替换。
有什么线索吗?
我试图理解一个使用sed. 我发现有些地方sed是用该-e选项调用的。
我试图查看man页面,它只是提到,
-e 命令
将命令参数指定的编辑命令附加到命令列表中。
这对我来说不是很清楚。
有人可以向我解释一下这是-e做什么的吗?谢谢。
PS:我sed在mac中使用
以下插入文件方法sed曾经有效,甚至在最后一行之前,但不再有效。这是当前的错误sed吗?
sed插入文件方法演示:
mkdir /tmp/test
printf '%s\n' {1..3} > /tmp/test/f1
printf '%s\n' {one,two,three,four,five,six,seven,eight,nine,ten} > /tmp/test/f2
$ cat /tmp/test/f2 | sed -e "/nine/r /tmp/test/f1" -e //N
one
two
three
four
five
six
seven
eight
1
2
3
nine
ten
$ head -9 /tmp/test/f2 | sed -e "/nine/r /tmp/test/f1" -e //N
one
two
three
four
five
six
seven
eight
nine
1
2
3
$ cat /tmp/test/f2 | sed -e "/ten/r /tmp/test/f1" -e //N
one
two
three
four
five
six …Run Code Online (Sandbox Code Playgroud) 我希望我的问题表述正确。我有一个大量使用“sed”的脚本。它在我的带有 GNU 'sed' 的 ubuntu 上运行良好。但是当我尝试在 BusyBox 上运行它时,它失败了。有没有办法在busybox上获得GNU sed?我不是 Linux 专家。
考虑以下文本(顺便说一句,是 MySQL 转储的一部分):
创建表`表`( `id` int(10) NOT NULL auto_increment, `name` varchar(100) NOT NULL 默认值 '', `description` 文本不为空, 主键(`id`), 全文键`full_index`(`name`) ) 引擎=MyISAM 默认字符集=latin1; /*!40101 SET character_set_client = @saved_cs_client */;
我想删除FULLTEXT密钥,我还想删除上面行中的尾随逗号,以便 SQL 保持有效。
任何人都可以想出(并解释)一个sed食谱来做到这一点吗?
我有一个 bash 文件,我想在其中存储一个版本文本(最好是“ echo version 1.0.1”,以便在执行时自动打印出自己的版本)
我正在尝试创建一个将更新版本的命令组。
到目前为止我有
grep "echo version" ~/.bashrc | cut -c 14- | sed -e 's/\./\n/g'
Run Code Online (Sandbox Code Playgroud)
提取“echo version 1.0.1”,切出“echo version”并在点之间拆分版本
1
0
1
Run Code Online (Sandbox Code Playgroud)
并且我达到了正则表达式、bash 和 google-foo 的限制以提取最后一个数字(补丁版本),我可以将其递增并写回文件。
主要是,我如何获得最后一个数字?
另外,如果我应该做的更好,请提出建议。
如何使用 sed 将文件的整个第一行替换为第一行加上一些附加文本?例如,如何附加-foo到仅包含一行的文件。
testfile 内容开始:
some-text
Run Code Online (Sandbox Code Playgroud)
testfile 内容结束:
some-text-foo
Run Code Online (Sandbox Code Playgroud)