web-dev-qa-db-ja.com

xargsを使用して、複数のコマンドの組み合わせ出力を一度に処理できる方法はありますか?

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

ファイルとglob式の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'
3
Atik Rahman

あなたは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
1
steeldriver

醜い方法: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
1
glenn jackman
$ 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.txtにリストされているドメインと、現在のディレクトリの文字xで始まるファイル名との間に一種の外積を生成します。

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

1
Kusalananda

必要なのはprintf '%s\n' x* 32000以上のファイルがある場合。

そうでなければこれはうまくいきます:

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

http://www.lulu.com/shop/ole-tange/gnu-parallel-2018/paperback/product-23558902.html の第1 +2章を読んでください( https://doi.org/10.5281/zenodo.1146014 )でダウンロードされます。あなたのコマンドラインはそれのためにあなたを愛します。

x*ファイルはsplitからのものです。第9章も読む必要があります。

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

)。

0
Ole Tange