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

관련 정보