2行を1つにマージし、Unixで終了パターンABCを使用して正しい行を使用したくない[閉じる]

2行を1つにマージし、Unixで終了パターンABCを使用して正しい行を使用したくない[閉じる]

次のファイルがあります。

07-10-2021-ABC-hello-203455
07-10-2021-Aer-hello-2034
55
07-10-2021-Aad-hello-20345
5
07-10-2021-dafC-hello-203
455

私が望む出力は次のとおりです。

07-10-2021-ABC-hello-203455
07-10-2021-aer-hello-203455
07-10-2021-Aad-hello-203455
07-10-2021-dafc-hello-203455

確認するのに役立ちますか?試してみましたがsed成功しませんでした。正しい行をスキップしたいので、unixで誤った2行をマージする必要があります。

答え1

plus 1を使用してこのソリューションを見つけました。sedawk

$ sed 's/^\([0-9]*\)$/#\1/' file | awk -v RS= '{ gsub(/\n#/, "", $0); print }'
07-10-2021-ABC-hello-203455
07-10-2021-Aer-hello-203455
07-10-2021-Aad-hello-203455
07-10-2021-dafC-hello-203455

1私はそれだけを確信していますsed または awk、しかし、これまで正しく動作しませんでした。

答え2

複数文字のRSとRTにGNU awkを使用する:

$ awk -v RS='[0-9]{2}(-[^-]*){5}\n' '
    { print gensub(/\n/,"","g",RT) }
' file
07-10-2021-ABC-hello-203455
07-10-2021-Aer-hello-203455
07-10-2021-Aad-hello-203455
07-10-2021-dafC-hello-203455

それ以外の場合は awk を使用してください。

$ awk '
    /^([0-9]{2}-){2}[0-9]{4}-/ {
        printf "%s%s", prev, $0
        prev = ORS
        next
    }
    { prev = $0 ORS }
    END {
        printf "%s", prev
    }
' file
07-10-2021-ABC-hello-203455
07-10-2021-Aer-hello-203455
07-10-2021-Aad-hello-203455
07-10-2021-dafC-hello-203455

答え3

これはawkを使用する1つの方法です。これは、「正しい」行が文字列を含む行であると仮定しますhello。基準が異なる場合は、正規表現を次のような別のものに変更するか、必要なものに/hello/変更してください。/-/length($0) > 10

$ awk '/hello/&&prev{print prev}/hello/{prev=$0;next}{prev=prev $0}END{if(prev)print prev}' file
07-10-2021-ABC-hello-203455
07-10-2021-Aer-hello-203455
07-10-2021-Aad-hello-203455
07-10-2021-dafC-hello-203455

より読みやすい形式で:

awk '
  /hello/ && prev {print prev}
  /hello/ {prev = $0; next}
  {prev = prev $0}
  END {if (prev) print prev}
' file

より多くの破損したファイルを使用した別のテスト:

$ cat file2
07-10-2021-ABC-hello-203455
07-10-2021-ABC-hello-203455
07-10-2021-ABC-hello-203455
07-10-2021-Aer-hello-2034
55
111
07-10-2021-Aad-hello-20345
07-10-2021-Aad-hello-20345
07-10-2021-Aad-hello-20345
5
07-10-2021-dafC-hello-203
455
07-10-2021-dafC-hello-203

$ awk '
  /hello/ && prev {print prev}
  /hello/ {prev = $0; next}
  {prev = prev $0}
  END {if (prev) print prev}' file2
07-10-2021-ABC-hello-203455
07-10-2021-ABC-hello-203455
07-10-2021-ABC-hello-203455
07-10-2021-Aer-hello-203455111
07-10-2021-Aad-hello-20345
07-10-2021-Aad-hello-20345
07-10-2021-Aad-hello-203455
07-10-2021-dafC-hello-203455
07-10-2021-dafC-hello-203

答え4

まず、すべての正しい行に「hello」がある場合は、次のコマンドを使用してこの出力を生成できます。

cat YourFile | grep hello

無効な行を一覧表示してそれを1つの行にマージするには、それを使用して「、」で区切られていることを示します。

cat YourFile | grep -v hello | paste -s -d, - 

このコマンド以降の出力は次のようになります。

55,5,455

関連情報