Memo/Linux/parallel

https://dexlab.net:443/pukiwiki/index.php?Memo/Linux/parallel
 

GNU parallel: コマンドの並列実行


トラブルシューティング

syntax error near unexpected token

  • エラー: awkやawscliのオプションに、シングルクオートを使うと出るようだ
    AWS_PROFILE=example
    AWS_REGIONS=$(aws --profile $AWS_PROFILE ec2 describe-regions --query "Regions[].[RegionName]" --output text)
    
    time parallel aws ec2 describe-instances \
      --query \''sort_by(Reservations[].Instances[].{A_Name:Tags[?Key==`Name`].Value|[0],B_InstanceId:InstanceId,C_PublicDnsName:PublicDnsName,D_State:State.Name}, &D_State)'\' \
      --output text \
      --profile $AWS_PROFILE \
      --region ::: ${AWS_REGIONS}
    
    /bin/bash: -c: line 0: syntax error near unexpected token `('
  • 解決:
    • 「 \''...'\'」のようにエスケープする
        --query \''sort_by(Reservations[].Instances[].{A_Name:Tags[?Key==`Name`].Value|[0],B_InstanceId:InstanceId,C_PublicDnsName:PublicDnsName,D_State:State.Name}, &D_State)'\'

TSV/CSV

  • TSVの特定のカラムだけ処理
    echo -e "A1\tB1\tC1\nA2\tB2\tC2" | parallel --colsep '\t' echo -e "{1}\\\t{2}"
    
    A1      B1
    A2      B2

使い方

xargsに似ている。

  • 多数のファイルに対して同じコマンドを実行
  • 大きなファイルを指定行単位でコマンドで処理
  • パイプ処理で、遅い部分を並列実行
  • 多重forループを並列実行
  • -j N: 並列度。デフォルトはCPUコア数x2
  • --joblog joblog.txt: 並列実行したコマンド、終了ステータス、実行時間を確認できる
  • 変数を展開: 「::: ${var}」
    a="a
    b
    c"
    
    parallel echo "{}" ::: ${a}
    a
    b
    c
  • パイプ経由で展開: {}に値が展開される
    echo -e "a\nb\nc" | parallel echo {}
    a
    b
    c
  • awkにパイプ経由でパラメータとして渡す
    echo -e "a\nb\nc" | parallel --pipe "awk '{print $1;}'"
    a
    b
    c

インストール

  • Ubuntu
    sudo apt install parallel
  • 引用のお願いメッセージを非表示にする
    parallel --citation
    ...
    > will cite

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2021-04-06 (火) 17:25:33 (13d)