如果不满足条件,则删除定界符并根据条件替换字符串

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~~~
  1. 每个文件应有 12 个字段(~ 作为分隔符),如果不是,则必须删除 ~。
  2. 如果第 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

如果您还有其他问题,请创建一个新问题而不是编辑这个问题。