이 숫자 표를 csv
다음과 같은 파일 형식으로 저장했습니다.
5, 6, 9, 5,
2, 8, 1, 1,
1, 2, 3, 6,
. . . . .
. . . . .
. . . . .
. . . . .
이 표의 각 행은 직사각형의 크기를 설명합니다.
다음과 같이 명령줄에 한 줄에 4개의 숫자를 입력하여 직사각형을 만들고 싶습니다.
rectang -cs x1 x2 x3 x4 # rectang is a script to create rectangle; -cs flag means dimensions; x1, x2, x3 x4 the rectangle dimensions
table.csv
csv 파일 " "을 탭으로 구분된 텍스트 " table.txt
" 파일로 변환한 다음 다음과 같이 for 루프에서 사용하려고 합니다 .
for i in $(cat table.txt); do
rectang -cs x1 x2 x3 x4
done
하지만 테이블에서 "직사각형" 명령으로 x1 x2 x3 x4를 제공하는 방법을 모르겠습니다.
도와 주셔서 감사합니다.
답변1
이 read
명령은 문자로 구분된 여러 단어를 캡처할 수 있습니다 $IFS
(기본값: 공백, 탭, 줄바꿈).
while read -r d1 d2 d3 d4; do
rectang -cs "$d1" "$d2" "$d3" "$d4"
done < file.csv
수정된 데이터(쉼표와 공백으로 구분된 필드)가 주어지면 다음을 수행합니다.
while IFS=",$IFS" read -r d1 d2 d3 d4; do # ...
필드 구분 기호로 쉼표를 포함합니다.
답변2
파일이 다음과 같은 경우:
cat table.txt | while read i
do
rectang -cs $i
done
이것은 다음을 호출합니다:
rectang -cs 5 6 9 5
rectang -cs 2 8 1 1
등.
답변3
Glenn의 답변은 물론 매우 훌륭하지만 이 경우에는 이를 사용하여 awk
명령줄을 생성한 다음 결과를 셸로 파이프합니다. POSIX의 일부 로서 awk
효과적인 솔루션이라고 할 수 있습니다.
awk -F'[, ]+' '{print "rectang -cs", $1, $2, $3, $4}' table.csv | sh
또는 첫 번째 필드를 첫 번째 필드에 할당하여 필드 구분 기호의 재계산을 트리거합니다.
awk -F'[, ]+' '$1=$1{print "rectang -cs", $0}' table.csv | sh
또는 비슷한 패턴을 사용합니다.
sed -e 's/^/rectang -cs /' -e 's/, */ /g' table.csv | sh
물론 실험할 때는 명령을 보고 sh
.