大家好,我有这个档案:
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$
感谢您的时间和帮助。
答案 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"