相关疑难解决方法(0)

为什么使用 shell 循环处理文本被认为是不好的做法?

在 POSIX shell 中使用while 循环来处理文本通常被认为是不好的做法吗?

正如Stéphane Chazelas 所指出的,不使用 shell 循环的一些原因是概念可靠性易读性性能安全性

这个答案解释了可靠性易读性方面:

while IFS= read -r line <&3; do
  printf '%s\n' "$line"
done 3< "$InputFile"
Run Code Online (Sandbox Code Playgroud)

为了性能,从文件或管道读取时,while循环和读取非常慢,因为内置read shell一次读取一个字符。

怎么样的概念安全性方面?

shell text-processing

241
推荐指数
4
解决办法
5万
查看次数

将 jq 输出合并为逗号分隔的字符串

我正在尝试curl一些返回 json 文件的 URL,然后我想从中解析主机并创建一个逗号分隔的字符串。

我有第一部分工作

curl -s -u "admin:admin" -H "X-Requested-By: ambari" "https://hbasecluster.net/api/v1/clusters/mycluster/services/ZOOKEEPER/components/ZOOKEEPER_SERVER" | jq -r '.host_components[].HostRoles.host_name'
Run Code Online (Sandbox Code Playgroud)

返回

zk0-mycluster.net
zk1-mycluster.net
zk2-mycluster.net
Run Code Online (Sandbox Code Playgroud)

现在我想将这些加入一个字符串中

zk0-mycluster.net,zk1-mycluster.net,zk2-mycluster.net
Run Code Online (Sandbox Code Playgroud)

command-line curl json jq

36
推荐指数
3
解决办法
6万
查看次数

如何找到字符最少的行

我正在编写一个 shell 脚本,使用任何通用的 UNIX 命令。我必须检索字符最少的行(包括空格)。最多可以有大约 20 行。

我知道我可以用它head -$L | tail -1 | wc -m来查找 L 行的字符数。问题是,我能想到的唯一方法是手动编写一堆 if 语句,比较这些值。

示例数据:

seven/7
4for
8 eight?
five!
Run Code Online (Sandbox Code Playgroud)

将返回,4for因为该行的字符最少。

就我而言,如果多行的长度最短,则应返回一条。选择哪一个并不重要,只要它是最小长度即可。但我没有看到为其他情况下的其他用户显示两种方式的危害。

shell text-processing wc

25
推荐指数
9
解决办法
6750
查看次数

将单独的行转换为带引号条目的逗号分隔列表

我有以下数据(从 Rmarkdown 文件解析的 R 包列表),我想将其转换为可以传递给 R 进行安装的列表:

d3heatmap
data.table
ggplot2
htmltools
htmlwidgets
metricsgraphics
networkD3
plotly
reshape2
scales
stringr
Run Code Online (Sandbox Code Playgroud)

我想将列表转换为以下形式的列表:

'd3heatmap', 'data.table', 'ggplot2', 'htmltools', 'htmlwidgets', 'metricsgraphics', 'networkD3', 'plotly', 'reshape2', 'scales', 'stringr'
Run Code Online (Sandbox Code Playgroud)

我目前有一个从原始文件到上面列表的 bash 管道:

grep 'library(' Presentation.Rmd \
| grep -v '#' \
| cut -f2 -d\( \
| tr -d ')'  \
| sort | uniq
Run Code Online (Sandbox Code Playgroud)

我想添加一个步骤以将新行转换为逗号分隔列表。我试过添加tr '\n' '","',但失败了。我还尝试了以下 Stack Overflow 的一些答案,但也都失败了:

这产生library(stringr)))phics)了结果。

这产生,%了结果。

这个答案(-i去除了标志)产生与输入相同的输出。

linux sed csv tr

21
推荐指数
3
解决办法
3万
查看次数

从文本文件中取出一段的最佳方法是什么?

从巨大的文本文件中提取第 20 -45 行的好方法是什么。当然是非交互的!

command-line text-processing

14
推荐指数
3
解决办法
5122
查看次数

如何将连续数字折叠到范围内?

给定一个包含唯一数字的排序输入文件(或命令输出),每行一个,我想将所有连续数字的运行折叠到范围内,这样

n
n+1
...
n+m
Run Code Online (Sandbox Code Playgroud)

变成

n,n+m
Run Code Online (Sandbox Code Playgroud)

输入样本:

2
3
9
10
11
12
24
28
29
33
Run Code Online (Sandbox Code Playgroud)

预期输出:

2,3
9,12
24
28,29
33
Run Code Online (Sandbox Code Playgroud)

awk perl text-processing numeric-data

10
推荐指数
5
解决办法
2139
查看次数

unix 查找结果的自定义分隔符

我想用来find查找一些文件,并将所有文件作为一行返回(没有换行符),并在文件之间使用自定义分隔符。

因此,例如三个文件的结果将是

/my/file/1::/my/file/2::/my/file/3
Run Code Online (Sandbox Code Playgroud)

代替

/my/file/1
/my/file/2
/my/file/3
Run Code Online (Sandbox Code Playgroud)

有没有办法结合使用标准的 unix 工具来实现这一点find

find

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

标签 统计

text-processing ×4

command-line ×2

shell ×2

awk ×1

csv ×1

curl ×1

find ×1

jq ×1

json ×1

linux ×1

numeric-data ×1

perl ×1

sed ×1

tr ×1

wc ×1