Linux에서 파일의 줄을 연결하는 방법에 대해 질문하고 싶습니다.
이것은 파일의 일부입니다:
"64f94e8e-4bd2-4721-95e7-7151cfbf3eb6"|"fanel"|""|""|""|"2020-05-20 12:23:54.611000+00:00"
"d955466b-125d-42dd-a1f6-a31e1ff6889b"|"Rancher_rke_1_0_8_Linux"|""|""|"Rancher 13 images scan:
199M May 20 12:58 calico-cni.tar
54M May 20 12:58 calico-kube-controllers.tar
252M May 20 12:58 calico-node.tar
108M May 20 12:58 calico-pod2daemon-flexvol.tar
40M May 20 12:58 cluster-proportional-autoscaler.tar
40M May 20 12:58 coredns-coredns.tar
82M May 20 12:58 coreos-etcd.tar
1.5G May 20 12:58 hyperkube.tar
40M May 20 12:58 metrics-server.tar
5.0M May 20 12:58 nginx-ingress-controller-defaultbackend.tar
488M May 20 12:58 nginx-ingress-controller.tar
737K May 20 12:58 pause.tar
129M May 20 12:58 rke-tools.tar
"|"2020-05-20 09:56:43.388000+00:00"
"853f2f8b-563b-4ea3-a465-7be4510ce66f"|"SPOT_NEWSCAN_747"|""|""|""|"2020-06-09 08:11:02.563000+00:00"
"f3d735a7-7883-48c1-91cc-28075d300d62"|"kinesis-stream-manager"|""|""|""|"2020-05-21 06:50:15.440000+00:00"
줄은 로 시작 "
하고 끝나지만 "
, 로 시작하는 줄은 "d955466b
끝나지 않고 "
다른 줄로 이어집니다.
문제가 있는 행을 찾을 수 있지만 sed -n '/\"$/!p' PROJECT2.csv
문제가 있는 행만 조인하는 방법을 모르겠습니다.
최종 결과는 다음과 같아야 합니다.
"d955466b-125d-42dd-a1f6-a31e1ff6889b"|"Rancher_rke_1_0_8_Linux"|""|""|"Rancher 13 images scan:199M May 20 12:58 calico-cni.tar54M May 20 12:58 calico-kube-controllers.tar252M May 20 12:58 calico-node.tar108M May 20 12:58 calico-pod2daemon-flexvol.tar40M May 20 12:58 cluster-proportional-autoscaler.tar40M May 20 12:58 coredns-coredns.tar82M May 20 12:58 coreos-etcd.tar1.5G May 20 12:58 hyperkube.tar40M May 20 12:58 metrics-server.tar5.0M May 20 12:58 nginx-ingress-controller-defaultbackend.tar488M May 20 12:58 nginx-ingress-controller.tar737K May 20 12:58 pause.tar129M May 20 12:58 rke-tools.tar"|"2020-05-20 09:56:43.388000+00:00"
답변1
큰따옴표의 개수를 세고 개수가 짝수가 될 때까지 줄을 추가해 보세요.
awk '{while (gsub(/"/, "&")%2) {getline X; $0 = $0 X}} 1' file
답변2
다음을 따르지 않는 모든 개행을 제거하십시오 "
.
$ perl -pe 's/(?<!")\n//' file
"64f94e8e-4bd2-4721-95e7-7151cfbf3eb6"|"fanel"|""|""|""|"2020-05-20 12:23:54.611000+00:00"
"d955466b-125d-42dd-a1f6-a31e1ff6889b"|"Rancher_rke_1_0_8_Linux"|""|""|"Rancher 13 images scan:199M May 20 12:58 calico-cni.tar54M May 20 12:58 calico-kube-controllers.tar252M May 20 12:58 calico-node.tar108M May 20 12:58 calico-pod2daemon-flexvol.tar40M May 20 12:58 cluster-proportional-autoscaler.tar40M May 20 12:58 coredns-coredns.tar82M May 20 12:58 coreos-etcd.tar1.5G May 20 12:58 hyperkube.tar40M May 20 12:58 metrics-server.tar5.0M May 20 12:58 nginx-ingress-controller-defaultbackend.tar488M May 20 12:58 nginx-ingress-controller.tar737K May 20 12:58 pause.tar129M May 20 12:58 rke-tools.tar"|"2020-05-20 09:56:43.388000+00:00"
"853f2f8b-563b-4ea3-a465-7be4510ce66f"|"SPOT_NEWSCAN_747"|""|""|""|"2020-06-09 08:11:02.563000+00:00"
"f3d735a7-7883-48c1-91cc-28075d300d62"|"kinesis-stream-manager"|""|""|""|"2020-05-21 06:50:15.440000+00:00"
또는
$ perl -pe 's/([^"])\n/$1/' file
"64f94e8e-4bd2-4721-95e7-7151cfbf3eb6"|"fanel"|""|""|""|"2020-05-20 12:23:54.611000+00:00"
"d955466b-125d-42dd-a1f6-a31e1ff6889b"|"Rancher_rke_1_0_8_Linux"|""|""|"Rancher 13 images scan:199M May 20 12:58 calico-cni.tar54M May 20 12:58 calico-kube-controllers.tar252M May 20 12:58 calico-node.tar108M May 20 12:58 calico-pod2daemon-flexvol.tar40M May 20 12:58 cluster-proportional-autoscaler.tar40M May 20 12:58 coredns-coredns.tar82M May 20 12:58 coreos-etcd.tar1.5G May 20 12:58 hyperkube.tar40M May 20 12:58 metrics-server.tar5.0M May 20 12:58 nginx-ingress-controller-defaultbackend.tar488M May 20 12:58 nginx-ingress-controller.tar737K May 20 12:58 pause.tar129M May 20 12:58 rke-tools.tar"|"2020-05-20 09:56:43.388000+00:00"
"853f2f8b-563b-4ea3-a465-7be4510ce66f"|"SPOT_NEWSCAN_747"|""|""|""|"2020-06-09 08:11:02.563000+00:00"
"f3d735a7-7883-48c1-91cc-28075d300d62"|"kinesis-stream-manager"|""|""|""|"2020-05-21 06:50:15.440000+00:00"
또는 GNU와 동일합니다 sed
.
$ sed -Ez 's/([^"])\n/\1/g' file
"64f94e8e-4bd2-4721-95e7-7151cfbf3eb6"|"fanel"|""|""|""|"2020-05-20 12:23:54.611000+00:00"
"d955466b-125d-42dd-a1f6-a31e1ff6889b"|"Rancher_rke_1_0_8_Linux"|""|""|"Rancher 13 images scan:199M May 20 12:58 calico-cni.tar54M May 20 12:58 calico-kube-controllers.tar252M May 20 12:58 calico-node.tar108M May 20 12:58 calico-pod2daemon-flexvol.tar40M May 20 12:58 cluster-proportional-autoscaler.tar40M May 20 12:58 coredns-coredns.tar82M May 20 12:58 coreos-etcd.tar1.5G May 20 12:58 hyperkube.tar40M May 20 12:58 metrics-server.tar5.0M May 20 12:58 nginx-ingress-controller-defaultbackend.tar488M May 20 12:58 nginx-ingress-controller.tar737K May 20 12:58 pause.tar129M May 20 12:58 rke-tools.tar"|"2020-05-20 09:56:43.388000+00:00"
"853f2f8b-563b-4ea3-a465-7be4510ce66f"|"SPOT_NEWSCAN_747"|""|""|""|"2020-06-09 08:11:02.563000+00:00"
"f3d735a7-7883-48c1-91cc-28075d300d62"|"kinesis-stream-manager"|""|""|""|"2020-05-21 06:50:15.440000+00:00"
답변3
한 가지 방법은 줄 끝에 큰따옴표가 있는지 여부에 따라 ORS 값을 할당하는 것입니다.
awk 'BEGIN { a[1] = ORS }
{ ORS = a[/"$/] };1' file
또 다른 방법은 GNU ed 편집기의 Join 명령과 줄 주소 지정을 사용하는 것입니다.
ed -s file <<\eof
v/"$/ .,//j
,p
Q
eof
awk는 일대일 방식으로 Perl로 이식될 수 있습니다.
$ perl -lpe '$\ = ($,,$/)[/"$/]' file
확장 정규 표현식 모드(-E)에서 GNU sed를 사용하는 방법은 다음과 같습니다.
sed -E '
/"$/b
:loop
$q;N;s/([^"])\n/\1/
tloop
P;D
' file
csplit 유틸리티를 사용하는 또 다른 방법은 다음과 같습니다.
cat - file <<\eof |\
csplit -sz - '/"$/' '{*}'
"."
eof
for f in xx*; do {
head -n 1 -
cat - | tr -d '\n'
} < "$f"
done | sed 1d
답변4
파일이 Excel과 같은 MS 도구에서 출력되는 경우 실제 줄 끝은 \r\n
개행 중간 필드가 \n
s일 가능성이 높습니다. 그러면 다중 문자 RS에 GNU awk를 사용하여 필요한 것은 다음과 같습니다.
$ awk -v RS='\r\n' '{gsub(/\n/,"")}1' file
"64f94e8e-4bd2-4721-95e7-7151cfbf3eb6"|"fanel"|""|""|""|"2020-05-20 12:23:54.611000+00:00"
"d955466b-125d-42dd-a1f6-a31e1ff6889b"|"Rancher_rke_1_0_8_Linux"|""|""|"Rancher 13 images scan:199M May 20 12:58 calico-cni.tar54M May 20 12:58 calico-kube-controllers.tar252M May 20 12:58 calico-node.tar108M May 20 12:58 calico-pod2daemon-flexvol.tar40M May 20 12:58 cluster-proportional-autoscaler.tar40M May 20 12:58 coredns-coredns.tar82M May 20 12:58 coreos-etcd.tar1.5G May 20 12:58 hyperkube.tar40M May 20 12:58 metrics-server.tar5.0M May 20 12:58 nginx-ingress-controller-defaultbackend.tar488M May 20 12:58 nginx-ingress-controller.tar737K May 20 12:58 pause.tar129M May 20 12:58 rke-tools.tar"|"2020-05-20 09:56:43.388000+00:00"
"853f2f8b-563b-4ea3-a465-7be4510ce66f"|"SPOT_NEWSCAN_747"|""|""|""|"2020-06-09 08:11:02.563000+00:00"
"f3d735a7-7883-48c1-91cc-28075d300d62"|"kinesis-stream-manager"|""|""|""|"2020-05-21 06:50:15.440000+00:00"
위의 코드는 이 입력 파일에서 실행됩니다.
$ cat -Ev file
"64f94e8e-4bd2-4721-95e7-7151cfbf3eb6"|"fanel"|""|""|""|"2020-05-20 12:23:54.611000+00:00"^M$
"d955466b-125d-42dd-a1f6-a31e1ff6889b"|"Rancher_rke_1_0_8_Linux"|""|""|"Rancher 13 images scan:$
199M May 20 12:58 calico-cni.tar$
54M May 20 12:58 calico-kube-controllers.tar$
252M May 20 12:58 calico-node.tar$
108M May 20 12:58 calico-pod2daemon-flexvol.tar$
40M May 20 12:58 cluster-proportional-autoscaler.tar$
40M May 20 12:58 coredns-coredns.tar$
82M May 20 12:58 coreos-etcd.tar$
1.5G May 20 12:58 hyperkube.tar$
40M May 20 12:58 metrics-server.tar$
5.0M May 20 12:58 nginx-ingress-controller-defaultbackend.tar$
488M May 20 12:58 nginx-ingress-controller.tar$
737K May 20 12:58 pause.tar$
129M May 20 12:58 rke-tools.tar$
"|"2020-05-20 09:56:43.388000+00:00"^M$
"853f2f8b-563b-4ea3-a465-7be4510ce66f"|"SPOT_NEWSCAN_747"|""|""|""|"2020-06-09 08:11:02.563000+00:00"^M$
"f3d735a7-7883-48c1-91cc-28075d300d62"|"kinesis-stream-manager"|""|""|""|"2020-05-21 06:50:15.440000+00:00"^M$