如何使用用户Bash给出的新值从所选id编辑特定列

时间:2016-03-16 10:01:27

标签: bash

我有这个文本文件

1221#John#baseball
31231#Nick#football 
......

我想在bash中创建一个像这样的命令

command new value column id

这将更改具有新值的特定ID的用户给出的列 我曾尝试使用sed,awk,grep和它们的一些组合,但没有任何效果。

1 个答案:

答案 0 :(得分:0)

好的,我不能发表评论,所以我会尝试以答案的形式这样做。

根据您的陈述,您希望USER能够通过运行命令来编辑其行,如下所示:

command [new value] [column id]

所以这就是我要写的剧本:

#!/bin/bash

newval="$1"
column="$2"
#Set your file below since you don't want to do it in the command use the full path
file="filename.txt"

#Reject any column 2 as you don't want users editing their ID
if [[ "$column" == "2" ]]; then
    echo "Invalid column ID, can not change username"
    exit 1
fi

#Find the username and look up the designated column
oldval=`grep "$USER" "$file" | awk -F "#" '{print $'$column'}'`
#Find line number so we know which to edit
linenum=`grep -n "$USER" "$file" | awk -F ":" '{print $1}'`
#Make the string to feed into sed as the preceding variable causes errors
string=$linenum"s/$oldval/$newval/g"
#Find the old value and replace it with the new value
sed -i "$string" $file

这样您就可以按照指定的方式运行命令。与任何命令一样,如果任何值中都有空格,则应使用引号来获取正确的值。

此外,如果该号码是用户ID,请按如下所示更改脚本:

添加:

UserID=`id -u`

变化:

if [[ "$column" == "1" ]]; then

变化:

oldval=`grep "$UserID" "$file" | awk -F "#" '{print $'$column'}'`
linenum=`grep -n "$UserID" "$file" | awk -F ":" '{print $1}'`