awk가 $0, $1, $2 등과 같이 xargs를 사용할 때 stdin 인수의 순서를 조작하는 방법이 있습니까?

awk가 $0, $1, $2 등과 같이 xargs를 사용할 때 stdin 인수의 순서를 조작하는 방법이 있습니까?

xargs를 사용하여 파이프라인 트래픽을 조작하는 방법을 배우려고 합니다. 표준 출력을 파이프할 수 없는 명령으로 명령의 출력을 파이프해야 하는 경우가 많습니다.

awk는 이를 사용하여 인쇄할 때 $0 기호가 전체 stdout을 나타내고 $1, $2 등이 별도의 필드인 것과 동등한 기능을 갖고 있는 것 같지만 xargs에서는 이에 상응하는 항목을 찾을 수 없는 것 같습니다.

예: 다음과 같습니다. 표준 출력은 순서가 지정되지 않은 인수 목록입니다.

file.txt:

secondfield firstfield thirdfield
secondfield2 firstfield2 thirdfield2
secondfield3 firstfield3 thirdfield3

다음과 같이 의사 코드를 실행하고 싶습니다.

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

내 프로그램은 예상되는 순서대로 입력 필드를 가져옵니다. 첫 번째 필드, 두 번째 필드, 세 번째 필드여야 하지만 표준 출력의 순서가 잘못된 것 같습니다. $1 $2 $3은 awk에만 존재합니다. 무엇과 동일합니까?

(이것은 단순한 예일 뿐이지만 요점은 다른 복잡한 명령(예: mv)에서 어떤 변수가 어디에 있는지 조작해야 하는 경우 stdout 스트림을 xargs로 정렬하는 방법을 알아야 한다는 것입니다.

답변1

이렇게 하면:

cat file.txt | xargs myprogram

그것은 다음과 같이 호출되는 것과 같습니다 myprogram:

myprogram secondfield firstfield thirdfield secondfield2 firstfield2 thirdfield2 secondfield3 firstfield3 thirdfield3

인수가 너무 길어서 명령줄에 전달할 수 없는 경우는 제외됩니다. 이것은 당신이 시작하고 싶은 것이 아닙니다. 반대로 해라

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

3개의 인수로 호출 되지만 myprogram필드 순서가 잘못되었습니다. 변경할 수 없다면 myprogram작은 Python 프로그램을 호출하겠습니다.

#!/usr/bin/env python

import sys
import subprocess

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

에 의해:

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

답변2

$ xargs -d '\n' -L1 sh -c 'set $1; echo $2 $1 $3' xx  < file.txt 
firstfield secondfield thirdfield
firstfield2 secondfield2 thirdfield2
firstfield3 secondfield3 thirdfield3

관련 정보