데이터를 세로 형식으로 파일에 저장하려는 시나리오가 있습니다.
아래는 데이터입니다
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