相关疑难解决方法(0)

如何在单个循环的每次迭代中从每个文件中读取一行?

我需要在一个循环中读取多个文件.我有一个带有X坐标的文件,一个带有Y坐标的文件和一个带有这些坐标上的字符的文件.

现在我paste用来将这些文件放在一起,然后在while循环中使用cut它们将它们分开:

paste x-file y-file char-file | while -r line; do
    Y=$(echo "$line" | cut -d\  -f1)
    X=$(echo "$line" | cut -d\  -f2)
    CHAR=$(echo "$line" | cut -d\  -f3)
done
Run Code Online (Sandbox Code Playgroud)

但问题是它真的很慢(cut一次又一次地打电话).

我应该如何做到这一点,在每个循环中有适当的值$Y,$X并$CHAR加快速度?

bash

2
推荐指数
1
解决办法
1073
查看次数

将前面的零添加到文件中的所有行

我有一个简单的文本文件,每行都包含一些随机数。我希望为数字较少的数字添加前面的零。有没有办法在命令行(UNIX)上做到这一点

输入文件:

235
25
1
963258
45
1356924
Run Code Online (Sandbox Code Playgroud)

输出文件:

0000235
0000025
0000001
0963258
0000045
1356924
Run Code Online (Sandbox Code Playgroud)

unix shell command-line padding sh

2
推荐指数
1
解决办法
1146
查看次数

读取具有多个列和空格的MySQL结果集

假设我有一个如下所示的MySQL表test:

+----+---------------------+
| id |     value           |
+----+---------------------+
| 1  | Hello World         |
| 2  | Foo Bar             |
| 3  | Goodbye Cruel World |
+----+---------------------+
Run Code Online (Sandbox Code Playgroud)

然后执行查询SELECT id, value FROM test。如何使用Bash将每列分配给变量read?

read -a截断第一个空格后的所有内容value:

mysql -D "jimmy" -NBe "SELECT id, value FROM test" | while read -a row;
do
    id="${row[0]}"
    value="${row[1]}"

    echo "$id : $value"
done;
Run Code Online (Sandbox Code Playgroud)

输出结果如下:

1 : Hello
2 : Foo
3 : Goodbye
Run Code Online (Sandbox Code Playgroud)

但我需要它看起来像:

1 : Hello …
Run Code Online (Sandbox Code Playgroud)

mysql bash

2
推荐指数
1
解决办法
5815
查看次数

测试是否有任何文件超过7天

我有一个脚本可以找到文件夹中的文件,如果它们超过7天,则删除它们.但是,我有一点问题.

#!/bin/bash
BACKUPDIR=/home/vagrant/script/aerospike_backups
TIMESTAMP=$(date +%Y-%m-%d)
LOGPATH=/tmp/logs.txt
ADMINACC=email@example.com
EMEIL=rybka@gl.com
#Let's check existing backups, and if it's older than 7 days delete
find_old () {
     if [ -z $(find $BACKUPDIR -mtime +7 -print ) ]
       then
            return 10
              else
find $BACKUPDIR -mtime +7 -delete && echo "Backups deleted at $HOSTNAME on $TIMESTAMP" >  $LOGPATH

fi
} 
Run Code Online (Sandbox Code Playgroud)

如果我从终端使用./scriptname执行带有$ BACKUPDIR的脚本,那么输入echo $?shell按预期输出10个代码,因为没有7天的文件或根本没有文件.

但是在我添加更多如果条件之后

if [[ $(find_old | echo $?) -gt 0 ]]
then
echo "Script return error code"
else
echo "all is ok"
Run Code Online (Sandbox Code Playgroud)

脚本给了我输出all …

bash find

2
推荐指数
1
解决办法
72
查看次数

根据文本文件将文件移回原始位置

我用mv -v命令移动了一堆文件.所以最后我有一个包含这样的文本文件:`

 /Volumes/[TV Shows]/Movie 1.avi --> /Volumes/Downloads/Movie 1.avi
 /Volumes/[TV Shows]/Movie 2.mp4 --> /Volumes/Downloads/Movie 2.mp4
Run Code Online (Sandbox Code Playgroud)

`

我需要Downloads根据此文本文件将每个文件从后面移动到其原始位置.原始位置将是-->我的文本文件内部之前的字符串.匹配标准是filename.

任何帮助将非常感激.

@jeremysprofile

我的文件可以在这里找到

在我的Mac上,我使用了以下代码:

#!/bin/bash

while IFS= read -r line; do
    #use http://wiki.bash-hackers.org/syntax/pe#substring_removal to grab the parts we want
    origin=${line% --> *}
    current=${line#* --> }
    mv -- "$current" "$origin"
done < ~/Desktop/myTextFile.txt
Run Code Online (Sandbox Code Playgroud)

结果的第一行是:

WYSIWYG:Desktop cip$ ./myMove.sh
mv: rename /Volumes/Public/English/[Sorted TV Shows]/Dimension/Dimension.404.s01e01.WEBDL.720p.NewStudio.TV.mkv -> /Volumes/Public/Downloads/from_tv_shows/Dimension.404.s01e01.WEBDL.720p.NewStudio.TV.mkv to /Volumes/Public/English/[Sorted TV Shows]/Dimension/Dimension.404.s01e01.WEBDL.720p.NewStudio.TV.mkv -> /Volumes/Public/Downloads/from_tv_shows/Dimension.404.s01e01.WEBDL.720p.NewStudio.TV.mkv: No such file or directory
mv: …
Run Code Online (Sandbox Code Playgroud)

macos bash terminal awk find

2
推荐指数
1
解决办法
61
查看次数

使用for循环bash脚本逐行读取文件

比方说,我有一个名为"tests"的文件,它包含

a
b
c
d
Run Code Online (Sandbox Code Playgroud)

我试图逐行读取这个文件,它应该输出

a
b
c
d
Run Code Online (Sandbox Code Playgroud)

我创建了一个名为"read"的bash脚本,并尝试使用for循环读取此文件

#!/bin/bash
for i in ${1}; do //for the ith line of the first argument, do...
   echo $i  // prints ith line
done
Run Code Online (Sandbox Code Playgroud)

我执行它

./read tests
Run Code Online (Sandbox Code Playgroud)

但它给了我

tests
Run Code Online (Sandbox Code Playgroud)

有谁知道发生了什么?为什么打印"测试"而不是"测试"的内容?提前致谢.

bash for-loop

1
推荐指数
2
解决办法
5万
查看次数

Bash- 使用循环填充关联数组

所以我有这个要输入和关联数组:

47 SPRINGGREEN2
48 SPRINGGREEN1
49 MEDIUMSPRINGGREEN
50 CYAN2
51 CYAN1
52 DARKRED
53 DEEPPINK4
Run Code Online (Sandbox Code Playgroud)

它是 bash 脚本的一部分。我正在寻找一种方法来制作一个关联数组,所以它看起来像

    declare -A cols=( [SPRINGGREEN2]="0;47"...[DEEPPINK4]="0;53" )
Run Code Online (Sandbox Code Playgroud)

我可以很容易地手动完成。

但我想使用 for 循环来填充数组 cols=( [KEY]="vALUE" ) For 循环将把 47, 48, 49...53 取出到 VALUE 字段中,并将 SPRINGGREEN2...DEEPPINK4 放入关键字段。

我正在考虑使用 awk,但无法弄清楚如何隔离这两个字段并使用每个条目来填充数组。

arrays bash awk associative-array

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

在 while 循环 bash 中通过多个值重复输出循环

我试图在 bash 中使用 while 循环来遍历 3 个文件的内容。它们包含名称、aws 账户和 aws 账号的列表。

但循环不正确,它不断重复列表中的第一个名称和列表中的第一个 aws 环境。

这是我看到的输出:

AWS user name: aadatiya does not exist in AWS account: company-lab
AWS user name: aadatiya does not exist in AWS account: company-lab
AWS user name: aadatiya does not exist in AWS account: company-lab
AWS user name: aadatiya does not exist in AWS account: company-lab
AWS user name: aadatiya does not exist in AWS account: company-lab
AWS user name: aadatiya does not exist in AWS account: company-lab …
Run Code Online (Sandbox Code Playgroud)

bash

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

计算行数或枚举行号,以便我可以遍历它们 - 为什么这是一种反模式?

我发布了以下代码并被骂了。为什么这是不可接受的?

numberOfLines=$(wc -l <"$1")
for ((i=1; $i<=$numberOfLines; ++$i)); do
  lineN=$(sed -n "$i!d;p;q" "$1")
  # ... do things with "$lineN"
done
Run Code Online (Sandbox Code Playgroud)

我们将输入文件中的行数收集到 中numberOfLines,然后从 1 循环到该数字,sed在每次迭代中从文件中提取下一行。

我收到的反馈抱怨说,sed在循环内部重复读取同一个文件以获取下一行效率低下。我想我可以使用,head -n "$i" "$1" | tail -n 1但这几乎没有效率,是吗?

有一个更好的方法吗?为什么我要避免这种特殊方法?

bash shell anti-patterns

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