从 shell 中的文件中打印特定部分
Printing specific parts from a file in shell
我正在尝试从具有特定格式的文件中打印一些特定信息(文件如下:id|lastName|firstName|gender|birthday|creationDate|locationIP|browserUsed
)
我只想打印出经过整理且唯一的 firstName。
我特别想在调用脚本时使用这些参数(我们称之为 script.sh):
./script.sh --firstnames -f <file>
到目前为止我的代码如下:
--firstnames )
OlIFS=$IFS
content=$(cat "" | grep -v "#")
content=$(cat "" | tr -d " ") #cut -d " " -f6 )
for i in $content
do
IFS="|"
first=( $i )
echo ${first[2]}
IFS=$OlIFS
done | sort | uniq
;;
esac
例如以下文件:
#id|lastName|firstName|gender|birthday|creationDate|locationIP|browserUsed
933|Perera|Mahinda|male|1989-12-03|2010-03-17T13:32:10.447+0000|192.248.2.12|Firefox
1129|Lepland|Carmen|female|1984-02-18|2010-02-28T04:39:58:781+0000|81.25.252.111|Internet Explorer
应该有输出:
Carmen
Mahinda
我注意到的一个问题是脚本也会打印注释。以上将打印:
Carmen
firstnames
Mahinda
尽管我已经使用 grep 删除了以“#”开头的行。
这只是代码的一部分(我认为这是问题所在)。它应该识别“--firstnames”。由于文件中的某些字段之间会有空格,特别是在最后一部分(浏览器部分),我只想删除该部分。
这是一个学校项目,根据对这部分进行评分的程序,这都是错误的。据我所知,该脚本有效(我对其进行了测试)。我不知道这有什么问题,因此我不知道要纠正什么。请帮忙!
grep -vE '^#' "" | cut -d'|' -f3
应该够了:
$ echo '#id|lastName|firstName|gender|birthday|creationDate|locationIP|browserUsed
> 933|Perera|Mahinda|male|1989-12-03|2010-03-17T13:32:10.447+0000|192.248.2.12|Firefox
> 1129|Lepland|Carmen|female|1984-02-18|2010-02-28T04:39:58:781+0000|81.25.252.111|Internet Explorer
>' | grep -vE '^#' | cut -d'|' -f3
Mahinda
Carmen
grep
命令删除 以 #
开头的行(它使用正则表达式来这样做,因此 -E
标志;如果你想要继续删除任何包含 #
的行,您当前的 grep -v #
是正确的),cut -d'|' -f3
命令围绕 |
分隔符和 returns 它的分隔符拆分字符串第三场.
awk 最适合您的情况
$ awk -F "|" 'FNR>1 && !a[]++{print }' file | sort
Carmen
Mahinda
-F "|"
: 在读取文件
中的字段时将|
设置为字段分隔符
FNR>1
:先跳过 header 行
a[]++
:创建一个关联数组,其中键作为第三个 field/column 中的字符串,即在 firstName 中,每次找到键时将其值递增 1。但是 </code> 的值仅在 <code>!a[]++
为真时打印,即当数组中不存在键时,或者我应该说键是第一次被读取时。
我正在尝试从具有特定格式的文件中打印一些特定信息(文件如下:id|lastName|firstName|gender|birthday|creationDate|locationIP|browserUsed
)
我只想打印出经过整理且唯一的 firstName。
我特别想在调用脚本时使用这些参数(我们称之为 script.sh):
./script.sh --firstnames -f <file>
到目前为止我的代码如下:
--firstnames )
OlIFS=$IFS
content=$(cat "" | grep -v "#")
content=$(cat "" | tr -d " ") #cut -d " " -f6 )
for i in $content
do
IFS="|"
first=( $i )
echo ${first[2]}
IFS=$OlIFS
done | sort | uniq
;;
esac
例如以下文件:
#id|lastName|firstName|gender|birthday|creationDate|locationIP|browserUsed
933|Perera|Mahinda|male|1989-12-03|2010-03-17T13:32:10.447+0000|192.248.2.12|Firefox
1129|Lepland|Carmen|female|1984-02-18|2010-02-28T04:39:58:781+0000|81.25.252.111|Internet Explorer
应该有输出:
Carmen
Mahinda
我注意到的一个问题是脚本也会打印注释。以上将打印:
Carmen
firstnames
Mahinda
尽管我已经使用 grep 删除了以“#”开头的行。 这只是代码的一部分(我认为这是问题所在)。它应该识别“--firstnames”。由于文件中的某些字段之间会有空格,特别是在最后一部分(浏览器部分),我只想删除该部分。 这是一个学校项目,根据对这部分进行评分的程序,这都是错误的。据我所知,该脚本有效(我对其进行了测试)。我不知道这有什么问题,因此我不知道要纠正什么。请帮忙!
grep -vE '^#' "" | cut -d'|' -f3
应该够了:
$ echo '#id|lastName|firstName|gender|birthday|creationDate|locationIP|browserUsed
> 933|Perera|Mahinda|male|1989-12-03|2010-03-17T13:32:10.447+0000|192.248.2.12|Firefox
> 1129|Lepland|Carmen|female|1984-02-18|2010-02-28T04:39:58:781+0000|81.25.252.111|Internet Explorer
>' | grep -vE '^#' | cut -d'|' -f3
Mahinda
Carmen
grep
命令删除 以 #
开头的行(它使用正则表达式来这样做,因此 -E
标志;如果你想要继续删除任何包含 #
的行,您当前的 grep -v #
是正确的),cut -d'|' -f3
命令围绕 |
分隔符和 returns 它的分隔符拆分字符串第三场.
awk 最适合您的情况
$ awk -F "|" 'FNR>1 && !a[]++{print }' file | sort
Carmen
Mahinda
-F "|"
: 在读取文件
中的字段时将|
设置为字段分隔符
FNR>1
:先跳过 header 行
a[]++
:创建一个关联数组,其中键作为第三个 field/column 中的字符串,即在 firstName 中,每次找到键时将其值递增 1。但是 </code> 的值仅在 <code>!a[]++
为真时打印,即当数组中不存在键时,或者我应该说键是第一次被读取时。