ORS拒绝将输出记录分成新行

时间:2016-04-21 20:26:59

标签: awk sh

大家好,我有这个档案:

paumic@os:~/l26$ cat p1
cat dog cow
cat dog mouse
dog cow cat

所以我想要做的就是获得前2列并让它们像这样:

cat dog
cat dog
dog cow

当我使用我的脚本时:

paumic@os:~/l26$ cat skript
#!/bin/sh    
output=$(cat $1 | awk 'BEGIN{ORS="\n"} {print $1, $2}' )
echo $output

我得到答案:

paumic@os:~/l26$ ./skript p1
cat dog cat dog dog cow

如果我使用其他内容而不是\n则可行。例如:

paumic@os:~/l26$ cat skript
#!/bin/sh
output=$(cat $1 | awk 'BEGIN{ORS="()"} {print $1, $2}' )
echo $output

paumic@os:~/l26$ ./skript p1
cat dog()cat dog()dog cow()
paumic@os:~/l26$

感谢您的时间和帮助。

1 个答案:

答案 0 :(得分:4)

始终引用您的变量。它可能并不总是必需的,但它是一个更安全的习惯。

此外,您可以简化awk的使用,并隐式包含对缺失选项的错误处理:

output=$(awk 'BEGIN{ORS="\n"} {print $1 ORS $2}' "${1:?No file provided}" )
echo "$output"

尽管明确处理错误可能会更好:

#!/bin/sh

if [ -z "$1" ]; then
  echo "ERROR: no file specified" >&2
  exit 1
elif [ ! -f "$1" ]; then
  echo "ERROR: no such file '$1'" >&2
  exit 1
elif [ ! -r "$1" ]; then
  echo "ERROR: file unreadable: '$1'" >&2
  exit 1
elif [ ! -s "$1" ]; then
  echo "WARNING: file empty: '$1'" >&2
fi

output=$(awk -v ORS="\n" '{print $1,$2}' "$1" )

echo "$output"