![](/img/trans.png)
[英]Replace a value for the nth column in a csv file with sed /awk/any linux tool
[英]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 列:
所以想要的格式是:
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/g
在sed
表達式的開頭。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.