如果不满足条件,则删除定界符并根据条件替换字符串
remove delimiter if condition not satisfied and substitute a string on condition
考虑以下文件。
HEAD~XXXX
XXX~XXX~XXX~XXX~XXX~XXX~~WIN~SCRIPT~~~
XXX~XXX~XXX~XXX~XXX~XXX~~WIN~TPSCRI~~~
XXX~XXX~XXX~XXX~XXX~XXX~~WIN~RSCPIT~~~
TAIL~20
希望上面的输出如下所示:
HEAD~XXXX
XXX~XXX~XXX~XXX~XXX~XXX~~WIN~SCRIPT~~~
XXX~XXX~XXX~XXX~XXX~XXX~~~~~~
XXX~XXX~XXX~XXX~XXX~XXX~~~~~~
TAIL~20
如果第 9 个字段是 SCRIPT,我希望第 8 个和第 9 个字段都像第 10 个字段一样为空,如果该行包含单词 HEAD/TAIL 那些必须从我们的上述条件中忽略,即 NF!= 13 - 将需要输入中的页眉和页脚。
我已经尝试了下面的方法,但应该有更聪明的方法。
awk -F'~' -v OFS='~' '( != "Working line takeover with change of CP" { = ""}) && ( != "Working line takeover with change of CP" { = ""}) {NF=13; print}' file
上面的不行
head -1 file > head
tail -1 file > tail
sed -i '/HDR/d' file
sed -i '/TLR/d' file
sed -i '/^\s*$/d' file
awk -F'~' -v OFS='~' ' != "Working line takeover with change of CP" {, = ""} {NF=13; print}' file >> file.tmp //syntax error
cat file.tmp >> head
cat tail >> head
echo "" >> head
mv head file1
我正在尝试使用具有以下要求的 UNIX shell 脚本。
考虑这样的文件..
XXX~XXX~XXX~XXX~XXX~XXX~~XXX~~SCRIPT~~~
XXX~XXX~XXX~XXX~XXX~XXX~~XXX~~OTHERS~~~~
XXX~XXX~XXX~XXX~XXX~XXX~~XXX~~OTHERS~~~
- 每个文件应有 12 个字段(~ 作为分隔符),如果不是,则必须删除 ~。
- 如果第 10 个字段中存在 SCRIPT 字符串以外的任何内容,则必须删除该字段。
我在 /bin/bash 中尝试了以下方法,我知道我做的不是很好。我正在为 sed 和 awk 命令提供线路。
while read readline
echo "entered while"
do
fieldcount=`echo $readline | awk -F '~' '{print NF}'`
echo "Field count printed"
if [ $fieldcount -eq 13 ] && [ $fieldcount -ne 12 ]
then
echo "entering IF & before deletion"
#remove delimiter at the end of line
#echo "$readline~" >> $S_DIR/.tmp
#sed -i '/^\s*$/d' $readline
sed -i s'/.$//' $readline
echo "after deletion"
if [ awk '/SCRIPT/' $readline -ne "SCRIPT"]
then
#sed -i 's/SCRIPT//' $readline
replace_what="OTHERS"
#awk -F '~' -v OFS=~ '{$'$replace_what'=''; print }'
sed -i 's/[^,]*//' $replace_what
echo "$readline" >> $S_DIR/.tmp
fi
else
echo "$readline" >> $S_DIR/.tmp
fi
done < $S_DIR/
awk -F'~' -v OFS='~' ' != "SCRIPT" { = ""} {NF=12; print}' file
XXX~XXX~XXX~XXX~XXX~XXX~~XXX~~SCRIPT~~
XXX~XXX~XXX~XXX~XXX~XXX~~XXX~~~~
XXX~XXX~XXX~XXX~XXX~XXX~~XXX~~~~
在bash中,我会写:
(
# execute in a subshell, so the IFS setting is localized
IFS='~'
while read -ra fields; do
[[ ${fields[9]} != "SCRIPT" ]] && fields[9]=''
echo "${fields[*]:0:12}"
done < file
)
你的后续问题:
awk -F'~' -v OFS='~' '
== "HEAD" || == "TAIL" {print; next}
!= "SCRIPT" { = = ""}
{NF=13; print}
' file
如果您还有其他问题,请创建一个新问题而不是编辑这个问题。
考虑以下文件。
HEAD~XXXX
XXX~XXX~XXX~XXX~XXX~XXX~~WIN~SCRIPT~~~
XXX~XXX~XXX~XXX~XXX~XXX~~WIN~TPSCRI~~~
XXX~XXX~XXX~XXX~XXX~XXX~~WIN~RSCPIT~~~
TAIL~20
希望上面的输出如下所示:
HEAD~XXXX
XXX~XXX~XXX~XXX~XXX~XXX~~WIN~SCRIPT~~~
XXX~XXX~XXX~XXX~XXX~XXX~~~~~~
XXX~XXX~XXX~XXX~XXX~XXX~~~~~~
TAIL~20
如果第 9 个字段是 SCRIPT,我希望第 8 个和第 9 个字段都像第 10 个字段一样为空,如果该行包含单词 HEAD/TAIL 那些必须从我们的上述条件中忽略,即 NF!= 13 - 将需要输入中的页眉和页脚。 我已经尝试了下面的方法,但应该有更聪明的方法。
awk -F'~' -v OFS='~' '( != "Working line takeover with change of CP" { = ""}) && ( != "Working line takeover with change of CP" { = ""}) {NF=13; print}' file
上面的不行
head -1 file > head
tail -1 file > tail
sed -i '/HDR/d' file
sed -i '/TLR/d' file
sed -i '/^\s*$/d' file
awk -F'~' -v OFS='~' ' != "Working line takeover with change of CP" {, = ""} {NF=13; print}' file >> file.tmp //syntax error
cat file.tmp >> head
cat tail >> head
echo "" >> head
mv head file1
我正在尝试使用具有以下要求的 UNIX shell 脚本。
考虑这样的文件..
XXX~XXX~XXX~XXX~XXX~XXX~~XXX~~SCRIPT~~~
XXX~XXX~XXX~XXX~XXX~XXX~~XXX~~OTHERS~~~~
XXX~XXX~XXX~XXX~XXX~XXX~~XXX~~OTHERS~~~
- 每个文件应有 12 个字段(~ 作为分隔符),如果不是,则必须删除 ~。
- 如果第 10 个字段中存在 SCRIPT 字符串以外的任何内容,则必须删除该字段。
我在 /bin/bash 中尝试了以下方法,我知道我做的不是很好。我正在为 sed 和 awk 命令提供线路。
while read readline
echo "entered while"
do
fieldcount=`echo $readline | awk -F '~' '{print NF}'`
echo "Field count printed"
if [ $fieldcount -eq 13 ] && [ $fieldcount -ne 12 ]
then
echo "entering IF & before deletion"
#remove delimiter at the end of line
#echo "$readline~" >> $S_DIR/.tmp
#sed -i '/^\s*$/d' $readline
sed -i s'/.$//' $readline
echo "after deletion"
if [ awk '/SCRIPT/' $readline -ne "SCRIPT"]
then
#sed -i 's/SCRIPT//' $readline
replace_what="OTHERS"
#awk -F '~' -v OFS=~ '{$'$replace_what'=''; print }'
sed -i 's/[^,]*//' $replace_what
echo "$readline" >> $S_DIR/.tmp
fi
else
echo "$readline" >> $S_DIR/.tmp
fi
done < $S_DIR/
awk -F'~' -v OFS='~' ' != "SCRIPT" { = ""} {NF=12; print}' file
XXX~XXX~XXX~XXX~XXX~XXX~~XXX~~SCRIPT~~
XXX~XXX~XXX~XXX~XXX~XXX~~XXX~~~~
XXX~XXX~XXX~XXX~XXX~XXX~~XXX~~~~
在bash中,我会写:
(
# execute in a subshell, so the IFS setting is localized
IFS='~'
while read -ra fields; do
[[ ${fields[9]} != "SCRIPT" ]] && fields[9]=''
echo "${fields[*]:0:12}"
done < file
)
你的后续问题:
awk -F'~' -v OFS='~' '
== "HEAD" || == "TAIL" {print; next}
!= "SCRIPT" { = = ""}
{NF=13; print}
' file
如果您还有其他问题,请创建一个新问题而不是编辑这个问题。