Linux Shell: 파일에서 파이프로 구분된 값 추출

Linux Shell: 파일에서 파이프로 구분된 값 추출

파일에 다음 값이 있습니다.

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

관련 정보