我正在尝试操纵文本文件。我已经把它的大部分都弄明白了,但我很难理解为什么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语句,那么小脚本会按照我的预期运行,而不会挂起。
那么,为什么这个悬挂呢?
答案 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}'