ファイルの行をリンクする方法

ファイルの行をリンクする方法

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改行中間フィールドが\nsである可能性が高くなります。次に、マルチキャラ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$

関連情報