簡體   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