将多行合并为单行,然后附加到 csv 输出文件

将多行合并为单行,然后附加到 csv 输出文件

我有多个以逗号分隔的文件,首先需要将这些行合并为一行,然后我可以将该行追加到一个 output.csv 文件中。

文件1.txt:

CV-1999-0001,
CV-1999-0002,
CV-1999-0003,
CV-1999-0004,
CV-1999-0005,
  ...

文件2.txt:

CV-2000-0006,
CV-2000-0007,
CV-2000-0008,
....

输出.csv:

IDs
CV-1999-0001,CV-1999-0002,CV-1999-0003,CV-1999-0004,CV-1999-0005
CV-2000-0006,CV-2000-0007,CV-2000-0008,CV-2000-0009,CV-2000-0010

我已经尝试过这些,但似乎都没有达到我的需要。我仍然得到多行

echo $(cat /Users/...../"$ROWS".txt) | sed 's/ //g' > "$ROWS_new".txt


echo $(cat paste -s -d "" files-1.txt) | sed 's/ //g' >> output.csv

答案1

使用 GNU awk 进行多字符 RS 并将每个文件读入内存:

$ awk -v RS='^$' -F',\n' -v OFS=',' '{$1=$1}1' file-1.txt file-2.txt
CV-1999-0001,CV-1999-0002,CV-1999-0003,CV-1999-0004,CV-1999-0005,
CV-2000-0006,CV-2000-0007,CV-2000-0008,

或者使用 GNU awk 进行多字符 RS 和 ENDFILE 一次读取 1 行:

$ awk -v RS=',\n' -v ORS=',' '1; ENDFILE{printf "\n"}' file-1.txt file-2.txt
CV-1999-0001,CV-1999-0002,CV-1999-0003,CV-1999-0004,CV-1999-0005,
CV-2000-0006,CV-2000-0007,CV-2000-0008,

或使用任何 awk 一次读取 1 行:

$ awk '
    FNR==1 { printf "%s%s", prev, ors; ors=ORS }
    FNR>1  { printf "%s", prev }
    { prev=$0 }
    END { print prev }
' file-1.txt file-2.txt
CV-1999-0001,CV-1999-0002,CV-1999-0003,CV-1999-0004,CV-1999-0005,
CV-2000-0006,CV-2000-0007,CV-2000-0008,

如果输入文件的最后一行以 s 结尾,则,很容易删除它,但由于问题中的示例输入以 s 结尾,...我们不知道您的输入文件是否真的以,s 结尾,所以我将其作为练习。

答案2

你尝试一下吗:

for ROW in ${ROWS}; do
    tr -d "\n" < "/Users/...../${ROW}.txt" \
    | sed -e 's/,$//'
done >> "output.txt"

答案3

使用sed提供-z( --null-data; separate lines by NUL characters) 选项并因此读取整个输入流的 a ,尝试

sed -z 's/\n//g; s/\r/\n/' file1 <(echo $'\r') file2
CV-1999-0001,CV-1999-0002,CV-1999-0003,CV-1999-0004,CV-1999-0005,
CV-2000-0006,CV-2000-0007,CV-2000-0008,

如果没有该选项,请尝试

sed -f chabo.sed  file1 <(echo $'\r') file2
CV-1999-0001,CV-1999-0002,CV-1999-0003,CV-1999-0004,CV-1999-0005,
CV-2000-0006,CV-2000-0007,CV-2000-0008,

与 chabo.sed 存在

:L
N
$!bL
s/\n//g
s/^M/\  
/

和( )^M字符。<cr>0x0D

答案4

这个解决方案有什么问题?

╰─ → $ paste -sd " " file1.txt file2.txt
CV-1999-0001, CV-1999-0002, CV-1999-0003, CV-1999-0004, CV-1999-0005,
CV-2000-0006, CV-2000-0007, CV-2000-0008,

相关内容