簡體   English   中英

使用 awk 或 sed 操作 a.csv 文件的第 n 列

[英]Manipulate nth column of a .csv file with awk or sed

我有一個包含 6 列的 .csv 文件:

source  raised_time cleared_time    cause   pcause  sproblem
source1 rtime1  ctime1  cause1  communicationsSubsystemFailure#model.route.1.2  oMCIFailure#model.route.1.2
source2 rtime2  ctime2  cause2  equipmentMalfunction#model.route.1.2    deviceNotActive#model.route.1.2

我想使用以下規則操作 .csv 文件的第 5 列和第 6 列:

  1. 將第 5 列和第 6 列的第一個字母轉換為大寫
  2. 將字符串保留到字符:“#”並刪除尾隨部分(在 # 字符之后)
  3. 在小寫字母和大寫字母之間留一個空格

所以想要的格式是:

source  raised_time cleared_time    cause   pcause  sproblem
source1 rtime1  ctime1  cause1  Communication Subsystem Failure OMCI Failure
source2 rtime2  ctime2  cause2  Equipment Malfunction   Device Not Active

如何使用 awk 或 sed 命令來做到這一點?

我嘗試使用以下命令將第一個字母轉換為大寫:

awk 'BEGIN {$5 = toupper(substr($5,1,1))
    substr($5, 2)}1' input_file

但它沒有用。

您說您的輸入是 CSV (逗號分隔值),但是其中沒有逗號,而字段之間確實有明顯的隨機間距,所以我假設您實際上是指 TSV(制表符分隔值)。 如果是這樣,那么這應該做你想要的:

$ cat tst.awk
BEGIN { FS=OFS="\t" }
NR > 1 {
    for (i=5; i<=NF; i++) {
        new = ""
        old = $i
        sub(/#.*/,"",old)
        while ( match(old,/[[:upper:]][[:lower:]]+/) ) {
            new = new substr(old,1,RSTART-1) " " substr(old,RSTART,RLENGTH)
            old = substr(old,RSTART+RLENGTH)
        }
        new = new old
        $i = toupper(substr(new,1,1)) substr(new,2)
    }
}
{ print }

.

$ awk -f tst.awk file
source  raised_time     cleared_time    cause   pcause  sproblem
source1 rtime1  ctime1  cause1  Communications Subsystem Failure        OMCI Failure
source2 rtime2  ctime2  cause2  Equipment Malfunction   Device Not Active

一個 GNU sed實現,假設輸入文件格式是 tsv(制表符分隔值):

sed -E '1! {
s/\t/\n/4
h
s/[^\n]*//
s/#[^\t]*//g
s/\B[[:upper:]][[:lower:]]/ &/g
s/\b[[:lower:]]/\U&/g
H
g
s/\n.*\n/\t/
}' file.tsv

如果字段由 分隔,則只需將\t替換為,
如果字段由非空白到空白轉換分隔,則輸入s/^\s+//; s/\s+$//; s/\s+/\t/g s/^\s+//; s/\s+$//; s/\s+/\t/g s/^\s+//; s/\s+$//; s/\s+/\t/gsed表達式的開頭。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM