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
1つの方法は、行の末尾に二重引用符があるかどうかに応じてORS値を割り当てることです。
awk 'BEGIN { a[1] = ORS }
{ ORS = a[/"$/] };1' file
もう1つの方法は、GNU edエディタのJoinコマンドと行アドレッシングを使用することです。
ed -s file <<\eof
v/"$/ .,//j
,p
Q
eof
awkは1対1の方法で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$