在 Amazon s3 存储桶中,我们将 Debian 软件包存储在不同的文件夹中。每个文件夹包含不同数量的文件。
从 s3 存储桶 (AWS) 调用 Debian 软件包时,软件包之间用空格分隔。现在我需要将这些空格分隔的包列表转换为换行符分隔的列表,即每行一个包文件。输入行不包含相同数量的空格。
每个目录包含不同数量的 Debian 软件包,最后将软件包逐行转换后会将所有软件包(不同文件夹的)存储在一个文件夹文件中。
- 输入示例:
package1.deb package2.deb pacakge3.deb pacakge4.deb package5.deb
- 期望的输出:
package1.deb package2.deb package3.deb pacakge4.deb package5.deb
这是当前针对 s3 存储桶的不同文件夹在后台运行的函数的尝试:
function convertSpaceToNewLine(){
for line in filename; do
cat $line| grep '.deb$'|tr [:space:] \\t | sed 's/\t\t*/\n/g' >> folder/newfile
done
}
我已经厌倦了许多命令,例如truncate
、awk
、xargs -n 1
和sed
。
答案1
“将空格分隔的字符串列表转换为换行符分隔的字符串列表”问题的直接解决方案相当简单:
awk '{for (i=1;i<=NF;i++) {print $i}}' input_file1 input_file2 ... > output_file
默认情况下,awk
以“空白”(即任意数量的连续空格或制表符)将行分割成单独的字段,因此该程序只需迭代每行的所有字段(=包文件名)并单独打印这些字段,每行一个字段。如果某行不包含字段,则该行也不会输出,因此空行不是问题。
awk
能够处理多个输入文件,因此也不需要循环。
但是,基础任务似乎更加复杂,因此为了获得更全面的解决方案,您需要在问题中提供更多详细信息。
答案2
空格分隔的数据在 bare 中处理起来很简单bash
,根本不需要外部程序。嗯,我想cat
符合外部程序的资格。
仍然:
$ cat << EOF > test.sh
set -- $(cat)
printf '%s\n' "$@"
EOF
$ chmod 755 test.sh
$ cat << EOF > inputfile
one two three four five six
seven eight
nine ten eleven
12, 13, 14
15,16
EOF
$ ./test.sh < inputfile
one
two
three
four
five
six
seven
eight
nine
ten
eleven
12,
13,
14
15,16
奥托,
我们将 Debian 软件包存储在不同的文件夹中。每个文件夹包含不同数量的文件。
如果您真正想要做的是创建给定目录树中所有包文件的列表,每行一个文件名,并且没有任何路径信息,那么:
$ find path/to/your/packages/ -name \*.deb -type f -exec basename {} \;
答案3
使用乐(以前称为 Perl_6)
~$ perl6 -ne '.put for .words;' Jarrar.txt
如果您只是想从命令行读取文件,Raku 可以获取其内容,将其分解为空格分隔.words
,并每行返回一个单词(即文件名)。
示例输入,文件名Jarrar.txt
(感谢@Jim_L):
one two three four five six
seven eight
nine ten eleven
12, 13, 14
15,16
示例输出:
one
two
three
four
five
six
seven
eight
nine
ten
eleven
12,
13,
14
15,16
OTOH,如果你想查看一个目录中的多个文件,你可以使用 Raku 的函数,它可以返回对象dir()
的文件列表:.IO
~$ raku -e 'for dir("$*CWD/subdir") {.IO.say};'
"file1.jpg".IO
"file2.png".IO
"Jarrar.txt".IO
一旦您找到了dir()
所需文件的正确位置,您就可以test
根据某种模式来仅返回所需内容:
~$ raku -e 'for dir(test => "*.txt") {.words.join("\n").put};'
one
two
three
four
five
six
seven
eight
nine
ten
eleven
12,
13,
14
15,16