파일에 다음 값이 있습니다.
line 1: 31915
line 2: Salchipapa|papa|salchicha|aceite|queso
papa, salchicha, aceite, queso의 값을 구해야 해요
이는 행 2 열 2에서 값을 가져와야 함을 의미합니다.
답변1
이를 모두 배열로 읽어서 나중에 IFS
사용하기 위해 보관할 수 있습니다 .
OIFS=$IFS; IFS='|'; array=($(sed '2q;d' "$filename")); IFS=$OIFS
echo ${array[0]}
Salchipapa
echo ${array[1]}
papa
이렇게 하면 배열의 요소 수를 알기 때문에 임의의 10개 값으로 제한되지 않고 나중에 "null"을 테스트할 필요가 없습니다.
echo ${#array[@]}
5
그러니까 당신은 그냥...
for (( i=0; i<${#array[@]}; i++ )); do echo ${array[$i]}; done
Salchipapa
papa
salchicha
aceite
queso
답변2
나는 이것을 했고 그것은 효과가 있었다:
for i in {2..10}
do
ingName=$(sed -n 2p $filename | cut -d '|' -f $i)
done
"sed -n 2p $filename"은 파일의 두 번째 줄을 가져온 다음 "cut -d '|' -f $i"는 파이프로 구분된 각 구성 요소를 제공합니다. 숫자 10은 최대 10개의 성분이 있음을 의미하므로 나중에 코드에서 변수 ingName이 null이 아닌 경우에만 작동하는지 확인합니다.
답변3
실제 파일의 내용이 다음과 같다고 가정합니다.
31915
Salchipapa|papa|salchicha|aceite|queso
그럼 당신은 사용할 수 있습니다
awk -F '|' 'FNR == 2 { for (i=2; i<=NF; ++i) print $i }' file
두 번째 줄의 두 번째 필드부터 시작하여 한 줄에 한 단어씩 필드를 인쇄합니다.
다음 sed
명령은 동일한 작업을 수행합니다.
sed '1d;2y/|/\n/;s/[^\n]*\n//' file
입력에서 첫 번째 줄을 제거한 다음 모든 파이프를 줄 바꿈으로 변경하고 첫 번째 줄 바꿈까지 제거(및 포함)하여 이를 수행합니다.
관로
tail -n 1 file | cut -d '|' -f 2- | tr '|' '\n'
tail
마지막 행 선택을 사용하여 두 번째 행에서 시작하는 필드를 추출한 cut
다음 모든 파이프를 줄 바꿈으로 변경하면 샘플 데이터와 동일한 출력이 생성됩니다.
위의 변형:
tail -n 1 file | tr '|' '\n' | tail -n +2
답변4
다음 명령을 사용해보십시오. 훌륭하게 작동합니다.
awk 'NR==2{print $NF}' filename| awk -F "|" '{$1="";print $0}' |sed -r "s/^\s+//g"| perl -pne "s/ /\n/g"
산출
papa
salchicha
aceite
queso