網(wǎng)站首頁 編程語言 正文
介紹
我將介紹它,因為在使用 Linux Bash 腳本讀取簡單的 CSV 文件并對其進行處理時,它非常容易編寫。
如何使用 cut 命令
作為讀取 CSV 文件并使用您經(jīng)常看到的 Bash 腳本對其進行處理的方法,有一種描述是從標(biāo)準(zhǔn)輸入中逐行讀取 CSV 文件并使用 cut 命令將列存儲在變量中。
hoge.sh 的內(nèi)容
?#!/bin/bash
while read line
do
? # 保存 $line 行中讀入的CSV文件的一行文本,通過cut命令分列保存在變量中。
? col1=$(echo ${line} | cut -d , -f 1)
? col2=$(echo ${line} | cut -d , -f 2)
? col3=$(echo ${line} | cut -d , -f 3)
? # 處理內(nèi)容描述在這里
? # $colX 參考讀入的 CSV 文件的文本
? echo "col1:$col1 col2:$col2 col3:$col3"
done < $1
csv文件的內(nèi)容
$ cat hoge.csv
a1,a2,a3
b1,b2,b3
c1,c2,c3
$
以 csv 文件作為參數(shù)執(zhí)行腳本
$ ./hoge.sh hoge.csv
col1:a1 col2:a2 col3:a3
col1:b1 col2:b2 col3:b3
col1:c1 col2:c2 col3:c3
$
如何使用 IFS 將列存儲在變量中
通過將分隔符 IFS 的環(huán)境變量更改為,并在 read 命令中設(shè)置多個變量,可以在不使用 cut 命令的情況下進行簡單的描述。
hoge.sh 的內(nèi)容
?#!/bin/bash
?# 將讀取的CSV文件的一行文本分列存儲在多個變量中
while IFS=, read col1 col2 col3
do
? # 處理內(nèi)容描述在這里
? # $colX 參考讀入的 CSV 文件的文本
? echo "col1:$col1 col2:$col2 col3:$col3"
done < $1
如何使用 IFS 將列存儲在數(shù)組中(●)
您還可以使用 read 命令的 -a 選項將拆分列存儲在數(shù)組中。
?#!/bin/bash
while IFS=, read -a col
do
? echo "col1:${col[0]} col2:${col[1]} col3:${col[2]}"
done < $1
這種方式是最推薦的,因為它是一個數(shù)組,所以很容易循環(huán)、添加、刪除、處理分列,并且可以靈活的引用和使用變量擴展來展示。
#!/bin/bash
while IFS=, read -a col
do
? for c in ${col[@]}
? do
? ? echo "loop:$c"
? done
? unset col[2]
? col+=(lastcol)
? echo "${col[@]}"
? echo "${col[@]:1}"
? echo "${col[@]/#/col:}"
done < $1
$ ./hoge.sh hoge.csv
loop:a1
loop:a2
loop:a3
a1 a2 lastcol
a2 lastcol
col:a1 col:a2 col:lastcol
loop:b1
loop:b2
loop:b3
b1 b2 lastcol
b2 lastcol
col:b1 col:b2 col:lastcol
loop:c1
loop:c2
loop:c3
c1 c2 lastcol
c2 lastcol
col:c1 col:c2 col:lastcol
$
對于空格或制表符分隔的文件
如果文件分隔符是空格分隔符(SSV)或制表符分隔符(TSV),則分隔符的環(huán)境變量IFS默認(rèn)為空格、制表符和換行符,因此在腳本中不指定IFS進行處理.我可以的。
?#!/bin/bash
while read -a col
do
? echo "col1:${col[0]} col2:${col[1]} col3:${col[2]}"
done < $1
但是,如果該列為空,則將省略其前后連續(xù)的空格和制表符,并將變量位置打包在一起。
$ cat hoge.ssv
a1 a2 a3
b1 b3
c3
$
$ ./hoge.sh hoge.ssv
col1:a1 col2:a2 col3:a3
col1:b1 col2:b3 col3:
col1:c3 col2: col3:
$
為了防止這種情況,您需要用逗號替換空格和制表符,并將它們讀入以逗號分隔的數(shù)組。
?#!/bin/bash
IFS=,
while read line
do
? col=(${line// /,})
? echo "col1:${col[0]} col2:${col[1]} col3:${col[2]}"
done < $1
#!/bin/bash
IFS=,
while read line
do
? col=(${line//$'\t'/,})
? echo "col1:${col[0]} col2:${col[1]} col3:${col[2]}"
done < $1
如何處理要讀取的CSV文件
如果您想以相反的順序讀取 CSV 文件,替換特定字符,然后讀取它,您可以在讀取 CSV 文件之前對其進行處理,方法是將進程替換的結(jié)果 <() 傳遞給標(biāo)準(zhǔn)輸入。
?#!/bin/bash
while IFS=, read -a col
do
? echo "col1:${col[0]} col2:${col[1]} col3:${col[2]}"
done < <(tac $1)
$ cat hoge.csv
a1,a2,a3
b1,b2,b3
c1,c2,c3
$
$ ./hoge.sh hoge.csv
col1:c1 col2:c2 col3:c3
col1:b1 col2:b2 col3:b3
col1:a1 col2:a2 col3:a3
$
如何使用awk命令
如果您想輕松處理或聚合 CSV 文件,使用 awk 命令處理它可能會更簡單。
awk命令從頭開始逐行讀取指定為參數(shù)的文件,自動將分隔符分隔的內(nèi)容存儲在變量$1,$2…中,可以逐行描述要處理的內(nèi)容。處理 CSV 文件時,需要在 -F 選項中指定逗號作為分隔符。
$ awk -F, '{print "col1:"$1,"col2:"$2,"col3:"$3}' hoge.csv
col1:a1 col2:a2 col3:a3
col1:b1 col2:b2 col3:b3
col1:c1 col2:c2 col3:c3
$
此外,如果處理內(nèi)容變得復(fù)雜,則可以將處理內(nèi)容描述在文件中作為腳本。
{
print "col1:"$1,"col2:"$2,"col3:"$3
}
$ awk -F, -f hoge.awk hoge.csv
col1:a1 col2:a2 col3:a3
col1:b1 col2:b2 col3:b3
col1:c1 col2:c2 col3:c3
$
如果文件分隔符是空格分隔 (SSV) 或制表符分隔 (TSV),則無需像 Bash 腳本那樣指定選項即可讀取,但由于變量位置已打包并存儲,因此指定選項更安全。
$ awk -F'[. ]' '{print "col1:"$1,"col2:"$2,"col3:"$3}' hoge.ssv
col1:a1 col2:a2 col3:a3
col1:b1 col2: col3:b3
col1: col2: col3:c3
$
$ awk -F'[.\t]' '{print "col1:"$1,"col2:"$2,"col3:"$3}' hoge.tsv
col1:a1 col2:a2 col3:a3
col1:b1 col2: col3:b3
col1: col2: col3:c3
$
awk 命令也是一個功能強大的命令,但是還有一種方法是使用 perl 命令來處理 CSV 文件,這種方法更加直觀和復(fù)雜。
這是一個非常復(fù)雜的命令,默認(rèn)包含在 Linux 服務(wù)器中,所以如果您有興趣,可以使用它。
原文鏈接:https://blog.csdn.net/weixin_43810067/article/details/124703381
相關(guān)推薦
- 2022-05-06 React自定義Hook-useForkRef的具體使用_React
- 2023-07-15 oracle查看死鎖以及處理死鎖
- 2022-10-24 利用Pandas求兩個dataframe差集的過程詳解_python
- 2022-10-29 go語言打包的網(wǎng)頁wasm示例詳解_Golang
- 2022-05-05 C語言的三種條件判斷語句你都了解嗎_C 語言
- 2022-06-04 Android自定義ScrollView實現(xiàn)阻尼回彈_Android
- 2022-03-27 Android實現(xiàn)井字游戲_Android
- 2023-01-26 Redis實戰(zhàn)之Jedis使用技巧詳解_Redis
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支