我有一个文本文件,其值如下:
a b
c d
e f
g h
i j
k l
m n
o p
q r
s t
u v
w x
我想将\n
分隔的垂直线转换为水平线:
a c e g
b d f h
i k m o
j l n p
q s u w
r t v x
我试过这个:
WRD=$(head -n 1 a.txt | wc -w);
for((i=1; i<=$WRD; i++)); do
awk '{print $'$i'}' a.txt | tr '\n' ' '; echo;
done > "sa.txt"
但是输出看起来像这样:
a c e g i k m o q s u w
b d f h j l n p r t v x
如何根据需要编辑输出?
答案 0 :(得分:3)
$ awk -v RS= '{
for (i=1;i<=2;i++) {
for (j=i;j<=NF;j+=2) {
printf "%s%s", $j, (j<(NF+i-2)?OFS:ORS)
}
}
print ""
}' file
a c e g
b d f h
i k m o
j l n p
q s u w
r t v x
答案 1 :(得分:2)
击:
while read -r line1; do if [[ -z $line1 ]]; then echo; continue; fi; read -r line2; echo "$line1 $line2"; done < file
并缩进:
while read -r line1; do
if [[ -z $line1 ]]; then
echo
continue
fi
read -r line2
echo "$line1 $line2"
done < file
输出:
a b c d e f g h i j k l m n o p q r s t u v w x
答案 2 :(得分:2)
尝试:此解决方案也适用于超过2个字段,(我在这里考虑的唯一事情是你没有任何空字段)。
@media only screen and (max-width: 480px) {
#wrapper, #main-content, #content, #form{
float: left;
width: 100%;
}
}
以上一条内线说明:
awk '/^$/{for(j=1;j<=val;j++){print A[j];delete A[j];};print}{for(i=1;i<=NF;i++){;A[i]=A[i]?A[i] FS $i:$i};val=NF} END{for(j in A){print A[j]}}' Input_file
答案 3 :(得分:1)
不确定您的数据是否会变得更复杂,但这应该让您开始:
awk 'NF{col1 = col1 (col1?FS:"") $1;col2 = col2 (col2?FS:"") $2;next}{print col1 RS col2;col1=col2=""}END{print col1 RS col2}' input_file
我们使用NF让我们知道包含数据的行并相应地存储它们。
END是必需的,因为在最后一个条目之后没有额外的行。
答案 4 :(得分:1)
使用sed
和paste
:
sed '/^$/p' inputfile | paste -d ' ' - -
输出:
a b c d
e f g h
i j k l
m n o p
q r s t
u v w x
请注意,上述内容可能不符合规范,因为它只适用于
矩形的偶数编号为 2x n ,( 2x4
转换为 4x2 )。 OTOH Cyrus&#39;和grail's
答案也会在不规则的矩形上失败,即如果被喂grep -v '[gx]' inputfile
。
使用csplit
和datamash
进行更一般的修复(适用于任何大小不等的矩形):
# Create a more irregular input file:
grep -v '[gx]' inputfile | tee vlines3
输出:
a b
c d
e f
i j
k l
m n
o p
q r
s t
u v
代码:
x=`mktemp -u`
csplit -f $x --suppress-matched -s vlines3 '/^$/' '{*}'
for f in ${x}* ; do
datamash -W -t' ' transpose < $f
echo
rm $f
done | head -n -1
输出:
a c e
b d f
i k m o
j l n p
q s u
r t v