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