Existe um meio de manipular a ordem dos argumentos de stdin ao usar xargs, muito parecido com o quão awk como $ 0, $ 1, $ 2, etc.?

1

Estou tentando aprender como manipular o fluxo de canos usando xargs. Muitas vezes eu preciso da saída dos meus comandos para serem inseridos em comandos que não podem ser canalizados pelo stdout.

awk parece ter algum equivalente para representar a totalidade do padrão com o símbolo $ 0 quando você imprime com ele, e $ 1, $ 2 etc são campos individuais, mas eu não consigo encontrar o equivalente em xargs em qualquer lugar. / p>

Exemplo: Algo assim: saída padrão é uma lista de argumentos que estão fora de ordem:

file.txt :

secondfield firstfield thirdfield
secondfield2 firstfield2 thirdfield2
secondfield3 firstfield3 thirdfield3

Eu quero executar o pseudocódigo que se parece com isso:

cat file.txt | xargs myprogram $2 $1 $3

myprogram toma campos de entrada na ordem em que deveria ser o firstfield, secondfield, then thirdfield, mas claramente meu stdout está fora de ordem. $ 1 $ 2 $ 3 só existem no awk. Qual é o equivalente?

(Este é apenas um exemplo simplificado, mas o ponto é que eu preciso saber como ordenar meu fluxo de saída padrão em xargs caso eu precise manipular quais varialbes vão aonde em outros comandos complicados (mv por exemplo)

    
por Tom 22.04.2016 / 21:13

2 respostas

0

Se você fizer isso:

cat file.txt | xargs myprogram

isto será como se myprogram fosse chamado como:

myprogram secondfield firstfield thirdfield secondfield2 firstfield2 thirdfield2 secondfield3 firstfield3 thirdfield3

a menos que seus argumentos sejam realmente longos e não possam ser passados na linha de comando. Não é com isso que você quer começar. Em vez disso, faça

cat file.txt | xargs --max-lines=1 myprogram

com esse myprogram será chamado com 3 parâmetros, mas com os campos na ordem errada. Se você não pode alterar myprogram , eu chamaria um pequeno programa python:

#!/usr/bin/env python

import sys
import subprocess

sys.exit(subprocess.call('myprogram', sys.argv[2], sys.argv[1], sys.argv[3]))

da seguinte maneira:

cat file.txt | xargs --max-lines=1 mypythonprog 
    
por 22.04.2016 / 23:09
0
$ xargs -d '\n' -L1 sh -c 'set $1; echo $2 $1 $3' xx  < file.txt 
firstfield secondfield thirdfield
firstfield2 secondfield2 thirdfield2
firstfield3 secondfield3 thirdfield3
    
por 24.04.2016 / 14:12

Tags