파이프로 구분된 데이터를 세로 형식 데이터로 변환하는 방법

파이프로 구분된 데이터를 세로 형식 데이터로 변환하는 방법

데이터를 세로 형식으로 파일에 저장하려는 시나리오가 있습니다.

아래는 데이터입니다

143|2345|3456|4567|2345|3457|2019-12-28 12:00:01|2019-12-28

다음 논리를 적용한 후 내 데이터는 다음 형식입니다.

cat demo.txt |rev| cut -d'|' -f3-|rev|cut -d'|' -f2-

아래와 같이 필요한 출력을 제공했습니다.

2345|3456|4567|2345|3457

그런데 이제 문제는 원하는 출력 데이터를 세로 형식으로 텍스트 파일에 저장하고 싶다는 것입니다.

아래 파일과 마찬가지로

2345
3456
4567
2345
3457

답변1

tr '|' '\n'

각 파이프를 개행 문자로 변환하고 트릭을 수행해야 합니다.

echo "143|2345|3456|4567|2345|3457|2019-12-28 12:00:01|2019-12-28" | tr '|' '\n'

아니면 귀하의 경우에 당신이 찾고 있는 것일 수도 있습니다.

cat file | tr '|' '\n' > newfile

답변2

여러 행과 다양한 수의 필드를 처리하기 위해 col1과 마지막 두 열을 제거하고 나머지 열을 수직으로 배치합니다.

awk '-F|' '{ for (f = 2; f <= NF - 2; ++f) print $(f); }' data.txt

답변3

원본 데이터와 GNU 사용 head:

$ tr '|' '\n' <demo.txt | head -n -2
143
2345
3456
4567
2345
3457

tr명령은 단순히 |- 문자를 개행 문자로 변경합니다. 표준 입력에서만 읽기 때문에 tr표준 입력으로 리디렉션해야 합니다.

GNU에 음수 행이 주어 지면 head데이터 끝에서 해당 숫자를 제거합니다.

또는 단일 호출로 다음을 수행합니다 sed.

$ sed 's/\(|[^|]*\)\{2\}$//; y/|/\n/' demo.txt
143
2345
3456
4567
2345
3457

여기서 교체는 두 문자와 각 문자 뒤의 문자열을 |일치시켜 마지막 두 개의 구분된 필드를 제거한 다음 명령은 나머지 각 필드를 줄 바꿈으로 변경합니다 ( 첫 번째 솔루션에서와 마찬가지로).|y|tr

아마도 : 를 사용하면 더 읽기 쉬울 것입니다 sed -E. ( |이제 - 문자 중 하나를 이스케이프 처리해야 한다는 점에 유의하세요.)

sed -E 's/(\|[^|]*){2}$//; y/|/\n/' demo.txt

관련 정보