xargsを使用して複数のコマンドの結合出力を一度に処理する方法はありますか?

xargsを使用して複数のコマンドの結合出力を一度に処理する方法はありますか?

複数のシェルコマンドがあり、xargs一緒に処理できるように同じインスタンスにパイプしたいと思います。

ファイルとグローバル式の2つの入力があります。

$ cat subdomains.txt 

admin.site.com
web.site.com
api.site.com

$ ls -d x*

xab  xac  xad

私はこれを次のようにしたいと思います:

admin.site.com:xab
admin.site.com:xac
admin.site.com:xad
web.site.com:xab
web.site.com:xac
web.site.com:xad
api.site.com:xab
api.site.com:xac
api.site.com:xad

私が試したコマンドは次のとおりです(動作しません)。

cat subdomains.txt |  ls -d x* | xargs -I value1,value2 echo 'value1:value2'

答え1

GNUを使用してこれを行うことができますparallel

$ printf '%s\n' x* | parallel echo "{1}:{2}" :::: subdomains.txt :::: -
admin.site.com:xab
admin.site.com:xac
admin.site.com:xad
web.site.com:xab
web.site.com:xac
web.site.com:xad
api.site.com:xab
api.site.com:xac
api.site.com:xad

答え2

醜いアプローチが必要です。eval中かっこ拡張は通常変数拡張の前に行われるため、2 回の評価が必要です。

sub=$( paste -sd, subdomains.txt )
xs=$( ls -d x* | paste -sd, )
eval "printf '%s\n' {$sub}:{$xs}"

より良い方法:各個々のステップの結果を配列に保存し、入れ子になったループを使用して結合します。

mapfile -t sub < subdomains.txt
xs=( x* )
for s in "${sub[@]}"; do
  for x in "${xs[@]}"; do
    echo "$s:$x"
  done
done

答え3

$ printf '%s\n' x* | join -t : -1 2 -2 2 -o 1.1,2.1 subdomains.txt -
admin.site.com:xaa
admin.site.com:xab
admin.site.com:xac
web.site.com:xaa
web.site.com:xab
web.site.com:xac
api.site.com:xaa
api.site.com:xab
api.site.com:xac

これは、ファイルにリストされているドメインと、現在のディレクトリの文字で始まるファイル名とのjoin間に一種の外積を生成するために使用されます。subdomains.txtx

交差積は、join存在しないフィールド(列2、-1 2およびで指定)-2 2に2つのデータセットを結合するように要求することによって生成されます。また、入力フィールドと出力フィールドの区切り文字を:withに指定-t :し、各ファイルから最初の列を取得するには明示的に使用する必要があります-o 1.1,2.1(そうでない場合は、結果から空の最初の列が得られます)。

答え4

printf '%s\n' x*ファイルが32,000以上の場合にのみ必要です。

それ以外の場合は、次のように動作します。

parallel mytool.sh --parm1 {1} --parm2 {2} :::: subdomains.txt ::: x*

1枚+2枚読むhttp://www.lulu.com/shop/ole-tange/gnu-parallel-2018/paperback/product-23558902.html(ダウンロードは以下のサイトで可能です。https://doi.org/10.5281/zenodo.1146014)。あなたのコマンドラインはあなたを愛するでしょう。

x*ファイルが次からインポートされた場合は、第split9章も読んでください。

parallel -a bigfile --block 10M --pipepart --argsep ,, -I ,, parallel --pipe --tee wc {} ::: -l -c -w

)。

関連情報