我需要在一个循环中读取多个文件.我有一个带有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加快速度?
我有一个简单的文本文件,每行都包含一些随机数。我希望为数字较少的数字添加前面的零。有没有办法在命令行(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) 假设我有一个如下所示的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) 我有一个脚本可以找到文件夹中的文件,如果它们超过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 …
我用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) 比方说,我有一个名为"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)
有谁知道发生了什么?为什么打印"测试"而不是"测试"的内容?提前致谢.
所以我有这个要输入和关联数组:
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,但无法弄清楚如何隔离这两个字段并使用每个条目来填充数组。
我试图在 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) 我发布了以下代码并被骂了。为什么这是不可接受的?
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但这几乎没有效率,是吗?
有一个更好的方法吗?为什么我要避免这种特殊方法?