スペースで区切られた大きな Debian パッケージのリストを改行で区切られたリストに変換する必要があります。

スペースで区切られた大きな Debian パッケージのリストを改行で区切られたリストに変換する必要があります。

Amazon s3 バケットは Debian パッケージを別のフォルダに保存します。各フォルダには異なる数のファイルが含まれています。

s3バケット(AWS)からDebianパッケージを呼び出すと、パッケージはスペースで区切られます。これで、スペースで区切られたパッケージのリストを改行で区切られたリスト、つまり1行に1つのパッケージファイルに変換する必要があります。入力行に同じ数のスペースが含まれていません。

各ディレクトリには、異なる数の Debian ソフトウェアパッケージが含まれています。最後に、パッケージを1行ずつ変換した後、すべてのパッケージ(別のフォルダにあります)がフォルダファイルに保存されます。

  • 入力例:
    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 1sed

答え1

「空白で区切られた文字列のリストを改行で区切られた文字列のリストに変換する」問題に対する簡単な解決策は非常に簡単です。

awk '{for (i=1;i<=NF;i++) {print $i}}' input_file1 input_file2 ... > output_file

デフォルトでは、行は「空白」(つまり連続する空白またはタブの数awk)に応じて別々のフィールドに分割されるため、プログラムは各行のすべてのフィールド(=パッケージファイル名)を繰り返し、そのフィールドを1行に1つずつ個別に印刷します。 。行にフィールドがない場合、その行も出力されないため、空の行は問題になりません。

awk複数の入力ファイルを処理できるため、ループも必要ありません。

ただし、基本的な作業はより複雑に見えるため、より包括的な解決策を得るには質問に詳細を提供する必要があります。

答え2

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 パッケージを別のフォルダに保存します。各フォルダには異なる数のファイルが含まれています。

実際に、必要な操作がパス情報なしで1行に1つのファイル名で指定されたディレクトリツリー内のすべてのパッケージファイルのリストを作成する場合は、次の手順を実行します。

$ find path/to/your/packages/ -name \*.deb -type f -exec basename {} \;

答え3

使用幸せ(以前のPerl_6)

~$ perl6 -ne '.put for .words;'  Jarrar.txt

コマンドラインからファイルを読みたい場合、Rakuはその内容をスペースで区切られたファイルに分割し、1行に1語.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、ディレクトリ内の複数のファイルを表示するには、dir()オブジェクトのファイルの一覧を返すRakuの機能を使用できます。.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

関連情報