即使已经完成,sed也不会退出

时间:2011-02-08 17:34:13

标签: bash sed

我正在尝试操纵文本文件。我已经把它的大部分都弄明白了,但我很难理解为什么sed似乎进入无限循环模式。可以从census.gov下载文本文件。

目前,我只想要一个状态列表,我可以将其放入for循环中以执行某些特定于状态的处理。到目前为止,我已经有了这个。 (我不是bash专家,欢迎提出建议。

sed 1d tables/ansi.csv | awk -F "," '{print $1}' | uniq | tr \n : | sed s/:/" "/g

我想把它放到$()中以在for循环中使用输出,但由于某种原因,sed挂断而不退出。我实际上需要在最终的sed命令中添加一些东西,以便正确地格式化,但是我想在进一步操作之前让它正常运行。

最后 - 我想要的东西看起来像(只显示前几个):

"AL" "AK" "AZ" "AR" "CA" "CO" ....

现在,sed的回报率低于我的预期和回报(仅显示最后几个)

...."MP" "PR" "UM" "VI" "

但是,而不是退出,sed挂起,我必须从脚本中Ctrl-C。如果我删除了最后的sed语句,那么小脚本会按照我的预期运行,而不会挂起。

那么,为什么这个悬挂呢?

2 个答案:

答案 0 :(得分:2)

我建议将sed脚本放在引号内:

sed 1d tables/ansi.csv | awk -F "," '{print $1}' | uniq | tr '\n' : | sed 's/:/" "/g'

sed似乎“挂起”的原因可能是tr删除了sed所需的最终换行符。顺便说一句,需要引用tr的换行参数。

然而,整个过程可以在AWK中完成:

awk -F, 'NR > 1 {a[$1]=$1} END { delim=":"; num=asort(a); for (i=1;i<=num;i++) printf "\"%s\" ",a[i]; printf "\n"}' tables/ansi.csv

答案 1 :(得分:0)

awk -F"," 'NR>1 && (!($1 in a)){print $1;a[$1]}' file|sort|awk '{printf "\"%s\" ",$1}'