簡體   English   中英

在Unix中使用SED / AWK將數據附加到特定的行號

[英]Append Data to a specific line number using SED/AWK in Unix

我有一個用冒號分隔的文件,如下所示。

StudentID:LastName:FirstName: 0962344:Bob:Billy: 0123456:Joe:Black: 0987654:Jess:Foo:

第一行將始終包含標題。 假設所有行中第3個字段之后的每個字段都包含成績。

假設我將hw1 添加到Joe Black,因為他很早就完成了。

StudentID:LastName:FirstName:hw1: 0962344:Bob:Billy:: 0123456:Joe:Black:100: 0987654:Jess:Foo::

第一個問題)

當我在某些行中具有行號時,或者在具有不同數據(分號,成績或如上所述的作業)的所有行中附加行號時,如何在行的末尾附加?

第二個問題)

我如何將數據添加到其他學生的那些新創建的字段中。 如果文件中還有更多成績,請為Bob和Jess添加hw1的成績。 例如

StudentID:LastName:FirstName:hw1:hw2: 0962344:Bob:Billy:HOW DO I ADD HERE:50: 0123456:Joe:Black:100:50: 0987654:Jess:Foo:AND HERE:50:

我假設我只能使用Awk,因為sed將遍歷每行。

高克

問題1:

 awk -F':' -vOFS=':' '{NF+=1}NR==1{$(NF-1)="hw1"}/Joe/{$(NF-1)=100}1' file
StudentID:LastName:FirstName:hw1:
 0962344:Bob:Billy::
 0123456:Joe:Black:100:
 0987654:Jess:Foo::

問題2:

awk -F':' -vOFS=':' 'NR==1{for(i=0;++i<=NF;)if($i=="hw1")l=i}/Bob/{$l="Your Num"}/Jess/{$l="Your New Num"}1' file
StudentID:LastName:FirstName:hw1:hw2:
 0962344:Bob:Billy:Your Num:50:
 0123456:Joe:Black:100:50:
 0987654:Jess:Foo:Your New Num:50:

你可以不用awk就可以做到。 當數據存儲在文件輸入中時,可以使用while read -r fields; do .. done < input遍歷不同的行while read -r fields; do .. done < input while read -r fields; do .. done < input 通過IFS=:將冒號用作fieldsep。
可以編輯循環中的邏輯(我將調用一個函數),以避免在嵌套很多的if語句中使用標題行的continue

while IFS=: read -r StudentID FirstName LastName garbage; do
        if [ "$StudentID" = "StudentID" ]; then
                echo "StudentID:FirstName:LastName:hw1:"
                continue
        fi
        if [ "${FirstName}" = "Joe" ] && [ "${LastName}" = "Black" ] ; then
                echo "${StudentID}:${FirstName}:${LastName}:100:"
        else
                echo "${StudentID}:${FirstName}:${LastName}::"
        fi
done < input > input2

我將輸出寫到input2,因為那將是問題2的輸入。
僅出於計算給比利100/4的樂趣。傑西很幸運,他得到100!

while IFS=: read -r StudentID FirstName LastName hw1 garbage; do
        if [ "$StudentID" = "StudentID" ]; then
                echo "StudentID:FirstName:LastName:hw1:hw2:"
                continue
        fi
        if [ "${FirstName}" = "Bob" ] && [ "${LastName}" = "Billy" ] ; then
                (( newnumber = 100 / 4 ))
                echo "${StudentID}:${FirstName}:${LastName}:${newnumber}:50:"
        elif [ "${FirstName}" = "Not" ] && [ "${LastName}" = "Existing" ] ; then
                echo "${StudentID}:${FirstName}:${LastName}:77:50:"
        elif [ -n "${hw1}" ]; then
                echo "${StudentID}:${FirstName}:${LastName}:${hw1}:50:"
        else
                echo "${StudentID}:${FirstName}:${LastName}:100:50:"
        fi
done < input2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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