我的文件有多行,需要根据需要进行处理。我找到了一个用变量做这个的脚本,但我不想用变量做这个,因为这会让我的代码变得更复杂
文件:
Id,Name,class,Section
1,Dileep,MBA,B
2,Pavan,tenth,C
3,Girish,graduate,D
我的输出文件应该是这样的 -
文件:
Id,Name,Class,Section
1,Dileep,MBA,B
2,Pavan,MCA,C
3,Girish,MBA,D
我使用sed命令执行此操作,下面是我为此创建的脚本。
#! /bin/sh
file=/tmp/dileep/details.txt
cat $file | sed '/Id,Name,/s/class/**C**lass/g' | tee -a $file
cat $file | sed '/2,Pavan,/s/tenth/**MCA**/g' | tee -a $file
cat $file | sed '/3,Girish,/s/graduate/**MBA**/g' | tee -a $file
我能够让第一行更改带标题的那一行,而不是实际数据,这将是硬编码数据,我可以进行此更改。
您能否告诉我我的错误以及如何纠正错误。
答案 0 :(得分:1)
首先(!)
你不能像这样使用T恤。一旦输入文件大于tee使用的缓冲区大小,您将松散输入文件。
关于这个话题,你的意思是这样吗?
我会使用awk
:
sanitize.awk :
BEGIN {
FS=OFS=","
}
$3=="class" {
$3="Class"
}
$3=="tenth"{
$3="MCA"
}
$3=="graduate" {
$3="MBA"
}
{
print
}
像以下一样运行:
awk -f sanitize.awk input.file > output.file
mv output.file > input.file
答案 1 :(得分:0)
您可以以不同的方式使用sed。我将首先修复你的脚本
file=/tmp/dileep/details.txt
output=/tmp/dileep/details.out
# Off-topic: cat $file | sed '...' can be replaced by sed '...' $file
cat $file | sed '/Id,Name,/s/class/**C**lass/g' |
sed '/2,Pavan,/s/tenth/**MCA**/g' |
sed '/3,Girish,/s/graduate/**MBA**/g' | tee -a ${output}
使用sed,您可以使用选项-e
:
file=/tmp/dileep/details.txt
output=/tmp/dileep/details.out
# No spaces after the last '\' of the line!
cat $file | sed -e '/Id,Name,/s/class/**C**lass/g' \
-e '/2,Pavan,/s/tenth/**MCA**/g' \
-e '/3,Girish,/s/graduate/**MBA**/g' | tee -a ${output}
或者你可以使用1长命令(看起来很可怕):
cat $file | sed -e \
'/Id,Name,/s/class/**C**lass/g;/2,Pavan,/s/tenth/**MCA**/g;/3,Girish,/s/graduate/**MBA**/g' | tee -a ${output}
这里需要的是命令文件:
cat /tmp/dileep/commands.sed
/Id,Name,/s/class/**C**lass/g
/2,Pavan,/s/tenth/**MCA**/g
/3,Girish,/s/graduate/**MBA**/g
并使用
cat $file | sed -f /tmp/dileep/commands.sed | tee -a ${output}
或更好,避免cat
sed -f /tmp/dileep/commands.sed ${file} | tee -a ${output}