簡體   English   中英

在 Bash 中使用 awk/sed 打印給定 csv 中的字段

[英]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.

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