[英]How to offset fields within a CSV file using awk, sed, cut, paste (Unix/Linux)?
[英]Utilizing awk/sed to print fields within a given csv in Bash
我正在嘗試使用 awk/sed 的組合來打印給定 csv 中的某些字段。 我在讓 awk 識別代碼中的給定參數(例如 ./printcsv.sh 3 5 - 參數為 3 和 5 並嘗試通過 awk 打印 csv 的第 3 和第 5 列)時遇到問題。
#! /bin/bash
read -p "What file would you like to print? " file
read -p "What directory is this file located in? " directory
cd $directory
touch readcsv.txt
for (( i = 1; i <= $#; i=i+1 ))
do
cat $file | awk -F "," -v var=${i} 'NR==2 {print $var }' "$directory"/"$file" >> readcsv.txt
done
cat readcsv.txt
rm readcsv.txt
我想或創建了一個臨時的 .txt 文件,我會將打印的字段附加到其中,以便讀取要讀取的 .txt 文件,但我遇到了麻煩(可能是因為缺乏 sed 的知識)在文件中創建一個表,因為輸出只有兩列緊挨着(非常長的列)。 另外,我不知道問題是否出在我創建的“for”循環中,或者我試圖擴展變量“i”的方式,但即使我將參數設置為 3 和 5,我的希望 $1 然后會轉換為參數 3(因此是 csv 中的第 3 列),而不是它仍然轉換為 awk 命令中的第 1 列。
作為參考框架,我對 Bash 非常陌生,都是通過在線課程自學的,在您進入非課程示例之前,這只能提供這么多幫助。
要print columns 3 and 5 of a csv via awk
您只需要:
num1=3
num2=5
awk -v list="$num1 $num2" '
BEGIN {
n = split(list,cols)
FS=OFS=","
}
{
for (i=1; i<=n; i++) {
printf "%s%s", $(cols[i]), (i<n ? OFS : ORS)
}
}
' file
並且,如果您關心的話,從 3 到 5 打印將是:
awk -v beg="$num1" -v end="$num2" '
BEGIN {
FS=OFS=","
}
{
for (i=beg; i<=end; i++) {
printf "%s%s", $i, (i<end ? OFS : ORS)
}
}
' file
以上假設您有一個非常簡單的 CSV,否則請參閱whats-the-the-most-robust-way-to-efficient-parse-csv-using-awk
在推出自己的內置插件之前,請嘗試使用內置插件。
例如, cut
已經可以滿足您的需求
$ cut -d, -f3,4,5 file
在您的腳本中,如果腳本輸入參數是“3,4,5”,您可以使用它
cut -d, -f"$@" "$file"
將顯示選定的列,無需創建臨時文件。 作為附帶的好處,它也支持范圍,因此您也可以使用“3-5”輸入格式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.