塞德

塞德

给定的文件看起来像

CHrIS   john    herzog  10001   Marketing
tim             johnson 10002   IT
ruth    bertha  Hendric 10003   HR
christ  jason   hellan  10004   Marketing

我的代码:

readFile=$1

#error checking to see if the file exists and is not a directory
if [ ! -f "$readFile" ]
then
    #echo failed no param passed
    exit 1
else
    #reads in the file and stores the information into the variabel var.
    while read -r var
    do
        #echo $var
        fName=$(echo "$var" | cut -f1 | awk '{print $1}')
        mName=$(echo "$var" | cut -f2 | awk '{print $2}' | tr "\t" "x")

        echo $mName
    done < $readFile
fi

如何将第 2 行中间的选项卡tim (needs to be an X) johnson 10002 IT更改为 X?

答案1

假设这些是{tab}空格中的字符......

您永远不会在awk或中看到制表符tr,因为它已被 用作字段分隔符cut

看来您正在尝试将空字段替换为x。如果是这种情况,您可以使用如下结构:

#!/bin/bash
#
while IFS= read -r line
do
    first=$(echo "$line" | awk -F$'\t' '{print $1}')
    middle=$(echo "$line" | awk -F$'\t' '{print $2}')
    last=$(echo "$line" | awk -F$'\t' '{print $3}')
    id=$(echo "$line" | awk -F$'\t' '{print $4}')
    dept=$(echo "$line" | awk -F$'\t' '{print $5}')

    echo "First is ${first:-x}"
    echo "Middle is ${middle:-x}"
    echo "Last is ${last:-x}"
    echo "Id is ${id:-x}"
    echo "Dept is ${dept:-x}"
    echo
done

我们不能分割,IFS=$'\t' read -r first middle last...因为read分割是按空格(空格、制表符、换行符)运行,而不是单个实例。 (实际上,它比这更复杂;请在手册页中查找“分词”以获取完整的详细信息。)

我避免使用echo "$line" | cut -f1等,因为如果cut用完字段,它会重用它找到的最后一个字段。

作为“${middle:-x}”的替代方案,x如果构造中未设置变量,您实际上可以分配给该变量${middle:=x}:如果您希望分配自行发生(而不是作为其他命令的副作用),请在其前面加上 no-op 命令前缀:

: ${middle:=x}
echo "The middle is $middle"    # Will be 'x' if it was unset

答案2

尝试这个:

假设内容存储在文件“file”中

cat file | sed -E 's/    /        x/'

会给

CHrIS   john    xherzog  10001   Marketing
tim     x         johnson 10002   IT
ruth    xbertha  Hendric 10003   HR
christ  jason   hellan  10004   Marketing

至于为什么sed要这样写,可以参考

答案3

假设文件从一开始就以制表符分隔:

$ cat -t file
CHrIS^Ijohn^Iherzog^I10001^IMarketing
tim^I^Ijohnson^I10002^IIT
ruth^Ibertha^IHendric^I10003^IHR
christ^Ijason^Ihellan^I10004^IMarketing

假设任务是x在第 2 列的任何空字段中插入 。

$ awk -F'\t' 'BEGIN { OFS = FS } $2 == "" { $2 = "x" } { print }' file
CHrIS   john    herzog  10001   Marketing
tim     x       johnson 10002   IT
ruth    bertha  Hendric 10003   HR
christ  jason   hellan  10004   Marketing

awk脚本将使用制表符作为输入和输出分隔符,并将检测第 2 列中的任何空字段并将其更改为x.

答案4

塞德

假设您的“sed”理解“\t”“\n”转义序列。如果没有的话,还有 WA。但这些会损害代码的逻辑。

 sed -e '
    s/\t/\n/;      # 1st field sep => \n , a char sure to not be in PS by definition
    s/\n\t/\tx\t/; # incase 2nd field empty then we will see the \n\t else not
    s/\n/\t/;      # just incase 2nd fields was nonempty, preceding would fail so deal here
' yourfile

珀尔

perl -F"\t" -pale '$F[1] || s/^\S+\t(?=\t)/$&x/' yourfile

相关内容