给定的文件看起来像
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