繁体   English   中英

如何将匹配两个模式的行附加到文件中的前一行?

[英]How to append lines that match two patterns to the previous line in a file?

我有一个 csv 文件,其中应该是一行,但被分成了几行。 我需要帮助来找到一种方法来加入被分割的行。 此外,字段的数量(由 , 分隔)不是固定的。

正确的行具有以下模式:

X,X,X,"() ",Y,H其中 X 可以是任意数量的字段。 但是,粗体部分(字符串的结尾)是固定的。 Y 和 H 都是一个词。

问题是这条线可以显示为(或任何变体):

X,X,

X, ”()”

,Y,H

我需要的是一种方法(awk,sed)将没有 24 个或更多逗号且不以“,Y,H,”结尾的行附加到上一行。

请记住,这是一个大文件,尽管我有 256 GB 的 RAM。

例子

  • 正确的线条

a, b, c, "()", h, k

a, b, c, d, "()", h, k

  • 文件中的相同行

第一行

一,乙,丙,

"()", h, k

第二行

A B C D, ”()”

, H

, k

到目前为止,我已经尝试过这个(不工作):

awk '/"[:space:]*,[:space:]*[:alpha:]+[:space:]*,[:space:]*[:alpha:]+$/{print}' 检查。 CSV

尝试找到以 ", X, Y 结尾的行,其中 X 和 Y 是单词。

此外,由于正确字段的最小数量为 24,我使用过:

awk 'NF<24{print}' check.csv

过滤掉少于 24 个字段的行。

我的想法是检测与两个正则表达式匹配的行并将它们附加到上一行。

谢谢!

这可能对您有用(GNU sed):

sed '/"()", *[^,]\+, *[^,]\+$/b;:a;N;s/\n//;/"()", *[^,]\+, *[^,]\+$/!ba;P;D' file

不要处理正确的线路,只是退出。

否则追加下一行,删除引入的换行符并再次尝试匹配。

重复直到匹配,然后打印/删除第一行并重复。

perl -lanF, -e 'push @L, grep length, @F; if ($L[-3] eq q/"()"/) { print join ",", @L; @L=() }' file

  • 使用-l -n -e在不打印的情况下循环输入行,将换行符附加到输出
  • 使用-a -F,通过在逗号上拆分输入来创建@F数组
  • push @L, grep length, @F将非空字段推送到@L
  • if ($L[-3] eq q/"()"/) - 如果倒数第三个累积字段是魔术标记:
    • print join ",", @L print all of @L join with commas
    • @L=()重置@L

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM