在Unix中使用SED / AWK将数据附加到特定的行号

时间:2015-12-03 02:59:16

标签: regex bash unix awk sed

我有一个用冒号分隔的文件,看起来像这样..

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将遍历每一行。

2 个答案:

答案 0 :(得分:2)

gawk的

问题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:

答案 1 :(得分:0)

你可以不用awk就可以。当数据存储在文件输入中时,您可以使用while read -r fields; do .. done < input循环遍历不同的行。使用冒号作为fieldsep是使用IFS=:完成的 可以编辑循环中的逻辑(我会调用一个函数),为了避免使用continue标题行的多个嵌套if语句。

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