2015-12-19 45 views
0

這聽起來可能會重複,但我無法完成此工作。如何在文本文件中替換包含「 n」的文本序列

考慮:

_ =空間
- =減號

particle_little.csv是這種形式的文件:

waste line to be deleted 
__data__data__data 
_-data__data_-data 
__data_-data__data 

我需要得到標準CSV格式爲particle_std.csv,如下所示:

data,data,data 
-data,data,-data 
data,-data,data 

我想使用tailtr做轉換,在這裏我分裂了命令:

  1. tail -n +2 particle_little.csv刪除第一線
  2. | tr -s ' '刪除重複的空間
  3. | tr '/\b\n \b/' '\n'刪除最初的空間
  4. | tr ' ' ','更改逗號空間
  5. > particle_std.csv把它放在一個輸出文件

但我得到這個(不包括第4步):

data 
data 
data 
-data 
... 

最後,文件是巨大的,所以它是幾乎不可能在編輯打開(我知道有超級編輯,也許可以)

+0

在我看來,你正在嘗試使用錯誤的工具來完成這項工作;有趣的是,它不能很好地工作。你是否僅僅使用'tr'和'tail'?或者你只需​​要完成這項工作,而這些是第一個可以實現的工具? 「數據」部分是否包含空格?大概不會。 –

+0

我需要得到的輸出,是的,這些是我發現的第一個工具(所以,我是他們的新用法) – onlycparra

+0

順便說一句,該文件是巨大的 – onlycparra

回答

1

我建議你使用AWK:

$ cat file 
waste line to be deleted 
    data data data 
-data data -data 
    data -data data 
$ awk -v OFS=, '{ $1 = $1 } NR > 1' file 
data,data,data 
-data,data,-data 
data,-data,data 

腳本設置輸出字段分隔OFS,,並且第一場重新分配給自身$1 = $1,造成awk來摸每一行(和替換的空間逗號)。第一行之後的行,其中NR > 1被打印(默認行爲是打印行)。

+0

哦!男人,這是神奇的,同時使我的解決方案變得有趣......謝謝,你能向我解釋你使用的選項嗎? – onlycparra

+0

我已經更新了我的答案,以便更多地解釋它,有什麼還不清楚嗎? –

0

你應該可能使用sedawk此:

sed -e 1d -e 's/^ *//' -e 's/ */,/g' 

一種方式做到這一點在awk適合:

awk 'NR == 1 { next } 
    { pad=""; for (i = 1; i <= NF; i++) { printf "%s%s", pad, $i; pad="," } print "" }' 

但有一個更好的方式來做到這一點在awk中:

awk 'BEGIN { OFS=","} NR == 1 { next } { $1 = $1; print }' data 

的BEGIN塊設置輸出字段分隔符;賦值$1 = $1;迫使Awk重新修改輸出行;打印print

我已經離開了第一個Awk版本,因爲它表明有多種方法可以做到這一點,在某些情況下,這樣的方法可能很有用。但是對於這個任務,第二個Awk版本更好 - 更簡單,更緊湊(和Tom Fenechanswer同構)。

+0

太棒了,謝謝你的回答和解釋 – onlycparra

1

所以,如果我正在讀你的權利 - 忽略行開始與空白。逗號分隔其他所有內容。

我建議perl

perl -lane 'next unless /^\s/; print join ",", @F'; 

此,給予時:

waste line to be deleted 
    data data data 
-data data -data 
    data -data data 

STDIN(或在指定的文件名)輸出:

data,data,data 
-data,data,-data 
data,-data,data 

這是因爲:

-l剝去換行符(並在每個print之後替換它們);在任何空白

-n

-a autosplits把它包裝在while (<>) {環路迭代一行行 - 功能就意味着它的工作原理就像sed/grep/tr並讀取STDIN或指定爲ARGS文件。

-e允許指定一個perl片段。

在這種情況下:

  • 跳過不\s或任何空白開始的行。
  • 任何其他行,加入字段(@F生成-a)與,作爲分隔符。 (這會自動插入一個換行符,因爲-l

然後您可以將輸出重定向到一個文件中(>output.csv),或使用-i.bak來就地編輯。

相關問題