我需要将大量以空格分隔的 Debian 软件包列表转换为以换行符分隔的列表

我需要将大量以空格分隔的 Debian 软件包列表转换为以换行符分隔的列表

在 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
}

我已经厌倦了许多命令,例如truncateawkxargs -n 1sed

答案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

https://docs.raku.org/routine/dir
https://raku.org

相关内容