網站首頁 編程語言 正文
介紹
我將介紹它,因為在使用 Linux Bash 腳本讀取簡單的 CSV 文件并對其進行處理時,它非常容易編寫。
如何使用 cut 命令
作為讀取 CSV 文件并使用您經常看到的 Bash 腳本對其進行處理的方法,有一種描述是從標準輸入中逐行讀取 CSV 文件并使用 cut 命令將列存儲在變量中。
hoge.sh 的內容
?#!/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)
? # 處理內容描述在這里
? # $colX 參考讀入的 CSV 文件的文本
? echo "col1:$col1 col2:$col2 col3:$col3"
done < $1
csv文件的內容
$ cat hoge.csv
a1,a2,a3
b1,b2,b3
c1,c2,c3
$
以 csv 文件作為參數執行腳本
$ ./hoge.sh hoge.csv
col1:a1 col2:a2 col3:a3
col1:b1 col2:b2 col3:b3
col1:c1 col2:c2 col3:c3
$
如何使用 IFS 將列存儲在變量中
通過將分隔符 IFS 的環境變量更改為,并在 read 命令中設置多個變量,可以在不使用 cut 命令的情況下進行簡單的描述。
hoge.sh 的內容
?#!/bin/bash
?# 將讀取的CSV文件的一行文本分列存儲在多個變量中
while IFS=, read col1 col2 col3
do
? # 處理內容描述在這里
? # $colX 參考讀入的 CSV 文件的文本
? echo "col1:$col1 col2:$col2 col3:$col3"
done < $1
如何使用 IFS 將列存儲在數組中(●)
您還可以使用 read 命令的 -a 選項將拆分列存儲在數組中。
?#!/bin/bash
while IFS=, read -a col
do
? echo "col1:${col[0]} col2:${col[1]} col3:${col[2]}"
done < $1
這種方式是最推薦的,因為它是一個數組,所以很容易循環、添加、刪除、處理分列,并且可以靈活的引用和使用變量擴展來展示。
#!/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),則分隔符的環境變量IFS默認為空格、制表符和換行符,因此在腳本中不指定IFS進行處理.我可以的。
?#!/bin/bash
while read -a col
do
? echo "col1:${col[0]} col2:${col[1]} col3:${col[2]}"
done < $1
但是,如果該列為空,則將省略其前后連續的空格和制表符,并將變量位置打包在一起。
$ 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:
$
為了防止這種情況,您需要用逗號替換空格和制表符,并將它們讀入以逗號分隔的數組。
?#!/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 文件之前對其進行處理,方法是將進程替換的結果 <() 傳遞給標準輸入。
?#!/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命令從頭開始逐行讀取指定為參數的文件,自動將分隔符分隔的內容存儲在變量$1,$2…中,可以逐行描述要處理的內容。處理 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
$
此外,如果處理內容變得復雜,則可以將處理內容描述在文件中作為腳本。
{
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 文件,這種方法更加直觀和復雜。
這是一個非常復雜的命令,默認包含在 Linux 服務器中,所以如果您有興趣,可以使用它。
原文鏈接:https://blog.csdn.net/weixin_43810067/article/details/124703381
相關推薦
- 2024-02-28 UNI-APP,text、rich-text控件顯示字符串,當字符串過長時,實現自動換行
- 2022-11-21 得物基于StarRocks的OLAP需求實踐詳解_數據庫其它
- 2022-04-23 C語言實現字符串轉浮點函數的示例_C 語言
- 2023-02-02 一文帶你深入了解C++中的類型轉換_C 語言
- 2022-04-14 Python之OptionParser模塊使用詳解_python
- 2022-05-11 [springboot]攔截器實現統一訪問日志
- 2022-10-26 c語言數據結構之棧和隊列詳解(Stack&Queue)_C 語言
- 2022-10-01 C語言實現學生個人消費管理系統_C 語言
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支