次のファイルがあります。
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を使用してこのソリューションを見つけました。sed
awk
$ 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